Executando - ou apenas iniciando - um daemon usando o launchd

2

Estou tentando configurar o YouTrack no OS X Lion Server e iniciá-lo na inicialização usando% código%. Eu fiz o download do arquivo jar YouTrack que eu posso executar com sucesso a partir da linha de comando usando launchd . Eu também envolvi o comando run em um shell script semelhante a isto que basicamente me permite interagir com a instância ativa usando java -Xmx512m -jar youtrack.jar 8080 e youtrack start . Ele armazena o id do processo do processo youtrack stop em um arquivo e as saídas para poder parar uma instância em execução, permitindo apenas uma instância, etc.

Para executar este comando no momento da inicialização, criei um arquivo de inicialização simples e o coloquei em / Library / LaunchDaemons, de acordo com as instruções fornecidas em java . As chaves principais usadas são man launchd.plist ( ProgramArguments ) e youtrack start (true). O problema é que, quando executado, a linha de comando RunAtLoad criará um arquivo contendo o pid do processo youtrack start , e eu posso ver esse processo em java ou top . Mas quando o comando estiver sendo executado pelo lanuchd ( ps ax ), o pid resultante não corresponderá a qualquer processo em execução, e o servidor web YouTrack não iniciará. É quase como se o processo java iniciado pelo launchd também terminasse assim que o launchd fosse finalizado.

No entanto, se eu simplesmente colocar o comando java diretamente no launchlist, ele funcionará bem. Eu simplesmente gostaria de entender por que isso é - eu pensei que a idéia de launchd era iniciar daemons. Mas isso significa que o daemon deve ser executado dentro do launchd durante toda a sua vida útil? Existe uma maneira alternativa de iniciar daemons com (ou sem) launchd, que me permitiria simplesmente executar um comando uma vez na inicialização? Basicamente, o que costumávamos fazer usando sudo launchctl load /Library/LaunchDaemons/org.example.youtrack.plist em @roboot em versões anteriores do OS X.

    
por Simon 07.02.2013 / 15:01

1 resposta

6

O Launchd não lança apenas programas, monitora-os à medida que são executados. Por padrão, ele espera que os programas continuem sendo executados (como daemons), não inicie algum outro programa (/ cópia em segundo plano de si mesmo / o que seja) e saia. Se o programa sair, o launchd faz duas coisas que podem causar problemas para um programa de execução e saída como youtrack start : ele "limpará" os subprocessos que sobraram (como o processo real do servidor) e (dependendo de algum outro configurações) talvez tente novamente o programa "falhou". Existem duas maneiras de resolver isso:

  1. Execute a forma de início: execute o item launchd java -Xmx512m -jar youtrack.jar 8080 diretamente (observe que cada "palavra" do comando deve ser um elemento separado da matriz ProgramArguments ). Se você adicionar <key>KeepAlive</key><true/> ao launchd .plist, ele reiniciará o servidor se ele falhar ou sair por qualquer motivo (observe que isso inclui a morte, portanto, você deve reescrever youtrack stop para usar launchctl unload ... e deixar o launchd fazer a matança).

  2. Diga ao launchd para não esperar que ele continue rodando, e não para matar os subprocessos. Adicione isso ao seu .plist para desativar o comportamento padrão:

    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
    
por 07.02.2013 / 19:11