O job de Launchd é executado, mas sai imediatamente

1

Desejo carregar e executar automaticamente um programa Lisp no CCL em segundo plano quando o meu Mac (OS 10.9) inicializar. Eu tenho uma lista de inicialização que salvei em / Library / LaunchDaemons,

<?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.icecreamcomputer</string>
    <key>ProgramArguments</key>
    <array>
            <string>sudo</string>
            <string>/Applications/ccl/./dx86cl</string>
            <string>-l</string>
            <string>/Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

Quando eu chamo

launchctl load /Library/LaunchDaemons/com.icecreamcomputer.plist

do terminal, posso ver em cima que o dx86cl é executado por alguns segundos e depois desaparece. Posteriormente launchd lista o trabalho como tendo saído. No entanto, se eu ligar

sudo /Applications/ccl/./dx86cl -l /Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp

do terminal, meu programa é inicializado e continua funcionando sem problemas. O que poderia estar fazendo com que meu job de lançamento fosse encerrado imediatamente após o início?

Aqui estão as entradas do /var/log/system.log:

Apr 15 10:01:55 frynseytv.icecreamcomputer.com sudo[34963]:     root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/Applications/ccl/./dx86cl -l /Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp
Apr 15 10:01:58 frynseytv com.apple.launchd[1] (com.icecreamcomputer): Throttling respawn: Will start in 8 seconds
Apr 15 10:02:00 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer[34965]): open("/var/log/icecreamcomputer.log", ...): 13: Permission denied
Apr 15 10:02:02 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer): Throttling respawn: Will start in 8 seconds

Aparentemente, ele não tinha permissão para abrir um log chamado "/var/log/icecreamcomputer.log" e, de fato, não existe esse arquivo ou diretório. Embora pareça estranho porque o root / wheel possui o /var/log/icecreamcomputer.log, e o root roda o launchd e os outros processos lançados, não é? Aqui está um trecho de /var/log/icecreamcomputer.log. Ele mostra o que normalmente é impresso quando o icecreamcomputer.lisp é carregado. O que falta é uma atividade de servidor HTTP registrada, como receber e atender solicitações.

Welcome to Clozure Common Lisp Version 1.9-r15759  (DarwinX8664)!
? 
==== quicklisp quickstart loaded ====

To continue with installation, evaluate: (quicklisp-quickstart:install)

For installation options, evaluate: (quicklisp-quickstart:help)

To load "hunchentoot":
Load 1 ASDF system:
hunchentoot
; Loading "hunchentoot"

Na verdade, quando faço o tail -f /var/log/icecreamcomputer.log, ele continua seus ciclos de aceleração e diz que falha ao gravar em seu log mesmo depois de eu chamar launchctl unload /Library/LaunchDaemons/com.icecreamcomputer. plist. Ele só parou de pedalar na reinicialização do servidor. O que da?

Após a reinicialização, tentei carregar o daemon novamente. Nenhuma mensagem de erro, mas a lista launchctl mostra que o processo foi encerrado e que o icecreamcomputer.log não mostrou nenhuma atividade enquanto eu carregava o plist do daemon.

    
por fpt 15.04.2014 / 04:40

1 resposta

1

Parece que sua programação LISP está violando os requisitos do daemon de launchd:

"Você não deve daemonizar seu processo. Isso inclui chamar a função daemon, chamar fork seguido por exec ou chamar fork seguido por exit. Se você fizer isso, o launchd concluirá que seu processo morreu. Dependendo das configurações da chave da lista de propriedades, O launchd continuará a tentar relançar seu processo até que ele desista (com uma mensagem de erro "respawning too fast") ou será incapaz de reiniciá-lo se ele realmente morrer. "

Fonte: link

Para entender melhor o launchd - particularmente para a sintaxe do plist - recomendo escrever um script hello world com um loop infinito usando o comando logger (1) para gravar no sylog com duração de ~ 5 segundos. Faça o script funcionar no primeiro plano e no plano de fundo para ver a diferença. Além disso, use plutil (1) para verificar novamente erros de sintaxe facilmente ignorados.

Os jobs launchd da Apple em / System / Library / LaunchDaemons também são uma excelente referência. Observe que o apache um em particular, que usa:

/ usr / sbin / httpd -D string > FOREGROUND

Para resolver o requisito de daemon do launchd.

Boa sorte!

    
por 17.04.2014 / 17:04