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 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?
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.
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