Como iniciar um serviço usando o launchctl do Mac OSX

3

Por que meu arquivo plist de configuração não é carregado como um serviço usando launchctl?

Estou executando o OSX Yosemite, e li este excelente tutorial sobre como usar o link >

Eu criei um arquivo .plist correto com a configuração do serviço (sei que isso está correto porque é uma cópia quase exata de um arquivo de configuração plist que criei vários anos atrás). Eu digito

launchctl load ~/Library/LaunchAgents/com.apple.myservice.plist

e responda

~/Library/LaunchAgents/com.apple.myservice.plist: File exists

Isso não é muito descritivo, mas eu digito

launchctl start com.apple.myservice

e não há saída e nada acontece. Eu também tentei usar

launchctl enable ~/Library/LaunchAgents/com.apple.myservice.plist

e eu acabei de receber um

Usage: launchctl enable <service-target>

em resposta.

Alguém pode responder com a sintaxe correta para carregar um serviço launchd no OSX Yosemite?

    
por almel 20.06.2015 / 17:34

2 respostas

4

Encontrei problemas semelhantes hoje em dia.

Basta descarregar o serviço e carregá-lo novamente para resolver o problema File exists .

Parece que toda vez que você atualiza um arquivo plist, você terá que fazer isso.

    
por 28.08.2015 / 08:52
1

launchd pode facilmente entrar em estados "estranhos".

  • load significa ler o arquivo de configuração e possivelmente programar uma inicialização.
  • unload significa stop e reprogramar o arquivo de configuração
  • start iniciará o serviço (ignorando o cronograma, acredito)
  • stop parará o serviço (novamente, ignorando o agendamento)

Geralmente, se você quiser "reiniciar", descarregue e recarregue a configuração assim:

launchctl unload -w ~/Library/LaunchAgents/com.apple.myservice.plist
launchctl load -w ~/Library/LaunchAgents/com.apple.myservice.plist

O -w significa "gravação", o que significa que a alteração afetará as reinicializações (carregará cada login ou inicialização ... ou não carregará nunca mais no login ou na inicialização).

Se for um serviço no nível do sistema (em /Library/LaunchDaemons ou /Library/LaunchAgents , talvez seja necessário fazer isso com sudo (e se você fez isso sem sudo por engano, talvez seja necessário descarregá-lo sem sudo e recarregá-lo com o sudo)

A chave em um arquivo que faz com que ele seja start on load é RunAtLoad (e KeepAlive o mantém em execução se morrer por algum motivo)

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

Às vezes é difícil obter o log de depuração do próprio launchctl, mas as chaves StandardErrorPath e StandardOutPath podem pelo menos ajudá-lo a saber se seu aplicativo está morrendo devido a informações ausentes ou incorretas (uma variável de ambiente não expansível ou não gravável) caminho, por exemplo). Apenas certifique-se de que o caminho especificado seja gravável pelo usuário que está executando o processo.

<key>StandardErrorPath</key>
<string>/tmp/appname-error.log</string>
<key>StandardOutPath</key>
<string>/tmp/appname-info.log</string>

Como são difíceis de depurar, recomendamos o uso de LaunchControl ou lançado e misture isso com uma leitura saudável de launchd.info .

Além disso, há várias dicas de depuração aqui: link

Ainda não experimentei, mas esta solução parece a mais simples:

sudo launchctl log level debug 
tail -f /var/log/system.log
    
por 27.06.2018 / 02:52