Qual é a maneira mais fácil de executar um script no momento da inicialização no OS X?

12

Eu quero que um script (bash / zsh / ruby ​​/ ...) seja executado no momento da inicialização no OS X. Qual é a maneira mais simples de fazer isso, sem mexer com arquivos xml / plist e, de preferência, sem precisar criar um meta AppleScript .

John Bachir
fonte

Respostas:

7

O MacOS X usa o Vixie cron, que possui metatags especiais para iniciar no momento da reinicialização. Consulte a página do manual para o formato do arquivo.

algo como:

@reboot /path/to/script.sh

no seu crontab funcionaria. Não tenho certeza de que essa seja uma solução melhor que o launchd, você provavelmente tem mais meta-ferramentas que olham para launchd do que o cron.

Rich Homolka
fonte
Adorei, você provou que eu estava errado :-) Embora cronno OS X não seja tão bom com o registro por padrão (havia um tópico sobre isso há apenas alguns dias).
Daniel Beck
isto é perfeito.
John Bachir
1
Observe que o cron, at e assim por diante são, em certa medida, reprovados no OS X. Não consigo encontrar uma declaração explícita disso nos vários documentos, nem sei quão agressivamente eles são obsoletos, mas o launchd parece geralmente preferido. Veja a documentação do launchd para uma introdução.
Norman Gray
O plist não funcionará para mim - isso funciona como um encanto - obrigado! :-D
BG Bruno
Honestamente não tinha certeza se a sintaxe seria o mesmo no OS X.
NobleUplift
6

Caso você mude de opinião:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.superuser.245713</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>UserName</key>
    <string>someuser</string>
</dict>
</plist>

Armazene como com.superuser.245713.plistem /Library/LaunchAgents/e faça root:wheelo proprietário / grupo.

Daniel Beck
fonte
1
É sem dúvida melhor para colocá-lo em /Library/LaunchAgentsvez de /System/Library/LaunchDaemonsuma vez /Systemé coisa OS-específico e aquela sob /Libraryé usado mais para o material de terceiros. Além disso, LaunchDaemons"deve conter itens que serão executados como raiz, geralmente processos em segundo plano", onde LaunchAgents"executados como usuário ou no contexto da área do usuário". A fonte dessas citações é um ótimo artigo sobre o launchd que eu consulte para perguntas do launchd.
Doug Harris
@DougHarris Obrigado pelas sugestões! Devo admitir que estava apenas digitando esse ad-hoc - enquanto costumo testar minhas soluções, não estava disposto a reiniciar minha máquina para isso.
Daniel Beck
Isso é muito bom, embora eu como a solução cron Vixie melhor :)
John Bachir
Na verdade, ele deve ser colocado em / Library / LaunchDaemons. Os agentes são executados apenas dentro de uma sessão do usuário, ou seja, eles não serão executados (ou mais precisamente, se qualificarão para executar) até que alguém faça login, execute novamente sempre que alguém fizer login e sempre execute como o usuário conectado no momento. Os daemons são executados (/ tornam-se elegíveis para execução) na inicialização e, embora normalmente sejam executados como root, podem ser executados como outro usuário com a chave UserName.
Gordon Davisson
2
@ the0ther A web não esquece.
Daniel Beck
2

Também existem ganchos de login, se você preferir que o script seja executado (como root) quando um usuário efetuar login em vez de quando a máquina for inicializada.

Deditos
fonte