Estou tentando configurarYouTrackno OS X Lion Server e inicie-o na inicialização usando launchd
. Baixei o arquivo jar do YouTrack que posso executar com êxito na linha de comando usando java -Xmx512m -jar youtrack.jar 8080
. Também envolvi o referido comando run em um script de shell semelhante aesseo que basicamente me permite interagir com a instância ativa usando youtrack start
e youtrack stop
. Ele armazena o ID do processo java
em um arquivo e as saídas para poder interromper uma instância em execução, permitindo apenas uma instância etc.
Para executar este comando no momento da inicialização, criei um launchd plist simples e coloquei-o em /Library/LaunchDaemons, conforme as instruções fornecidas em man launchd.plist
. As chaves principais utilizadas são ProgramArguments
( youtrack start
) e RunAtLoad
(true). O problema é que ao executar a linha de comando youtrack start
criará um arquivo contendo o pid do java
processo, e posso ver esse processo em top
ou ps ax
. Mas quando o comando está sendo executado por lanuchd ( sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist
), o pid resultante não corresponderá ao de nenhum processo em execução e o servidor da web YouTrack não será iniciado. É quase como se o processo Java iniciado pelo launchd também terminasse quando o launchd terminasse.
No entanto, se eu simplesmente colocar o comando java diretamente no launchd plist, ele funcionará bem. Eu simplesmente gostaria de entender por que isso acontece - pensei que a ideia do launchd era iniciar daemons. Mas isso significa que o daemon deve rodar dentro do launchd durante toda a sua vida útil? Existe uma maneira alternativa de iniciar daemons com (ou sem) o launchd, que me permitiria simplesmente executar um comando uma vez na inicialização? Basicamente, o que costumávamos fazer @roboot
nas cron
versões anteriores do OS X.
Responder1
O Launchd não apenas inicia programas, ele os monitora enquanto são executados. Por padrão, ele espera que os programas continuem em execução (como daemons), não iniciem algum outro programa (/cópia em segundo plano de si mesmos/qualquer coisa) e saiam. Se o programa sair, o launchd fará duas coisas que podem causar problemas para um programa de execução e saída como youtrack start
: ele "limpará" os subprocessos restantes (como o processo real do servidor) e (dependendo de algumas outras configurações) talvez tente novamente o programa "com falha". Existem duas maneiras de resolver isso:
Faça da maneira launchd: execute o item launchd
java -Xmx512m -jar youtrack.jar 8080
diretamente (observe que cada "palavra" do comando deve ser um elemento separado daProgramArguments
matriz). Se você adicionar<key>KeepAlive</key><true/>
ao launchd .plist, ele reiniciará o servidor se ele travar ou sair por qualquer motivo (observe que isso inclui ser eliminado, então você deve reescreveryoutrack stop
para usarlaunchctl unload ...
e deixar o launchd fazer a eliminação).Diga ao launchd para não esperar que ele continue em execução e para não eliminar subprocessos. Adicione isto ao seu .plist para desativar o comportamento padrão:
<key>KeepAlive</key> <false/> <key>AbandonProcessGroup</key> <true/>