Executando – ou apenas iniciando – um daemon usando launchd

Executando – ou apenas iniciando – um daemon usando launchd

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 starte youtrack stop. Ele armazena o ID do processo javaem 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 startcriará um arquivo contendo o pid do javaprocesso, e posso ver esse processo em topou 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 @robootnas cronversõ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:

  1. Faça da maneira launchd: execute o item launchd java -Xmx512m -jar youtrack.jar 8080diretamente (observe que cada "palavra" do comando deve ser um elemento separado da ProgramArgumentsmatriz). 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 reescrever youtrack stoppara usar launchctl unload ...e deixar o launchd fazer a eliminação).

  2. 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/>
    

informação relacionada