Usando o launchd para tarefas não-daemon curtas

1

Eu quero criar um "item de inicialização" no os x. Toda a documentação recente sugere que o launchd deve ser preferido em relação aos Itens de inicialização tradicionais.

No entanto, o launchd parece ser voltado para o lançamento de daemons reais, não para tarefas rápidas que fazem seu trabalho e saem. A biblioteca do desenvolvedor documento diz:

Important: If your daemon shuts down too quickly after being launched, launchd may think it has crashed. Daemons that continue this behavior may be suspended and not launched again when future requests arrive. To avoid this behavior, do not shut down for at least 10 seconds after launch.

Isso me dá a impressão de que launchd não é o caminho a percorrer. A implementação de um sono de 10 segundos soa como uma solução malfeita.

Em essência, minha pergunta se resume a: Qual é a maneira correta de executar um programa "Hello world" na inicialização? É lançada a ferramenta errada aqui?

    
por jjs 10.05.2011 / 15:08

1 resposta

1

A menos que você precise de compatibilidade com versões antigas do OS X (isto é, 10.3 ou anterior), eu usaria um LaunchDaemon. O problema de que os daemons saiam muito rapidamente é apenas um problema se o launchd for para relançar o daemon. Se eu entendi seu caso, isso não é relevante. O motivo pelo qual eu usaria um LaunchDaemon em vez de um StartupItem é que o processo de inicialização aguardará a conclusão de StartupItems; Eu não testei isso bem, mas a minha impressão é que até mesmo um StartupItem bastante rápido irá desacelerar significativamente o processo de inicialização.

Então, eu iria com um LaunchDaemon. Apenas certifique-se que o seu .plist inclui:

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>

Se o programa gerar todos os subprocessos que precisam continuar em execução depois que o pai sair, inclua também:

<key>AbandonProcessGroup</key>
<true/>

... para evitar que o launchd "limpe" os subprocessos que sobraram.

    
por 10.05.2011 / 21:41