OS X: LaunchDaemon não está em execução: o serviço não pôde inicializar

7

Eu usei Os documentos aparentemente simples da Apple criam um LaunchDaemon para executar um script do Node.js que eu escrevi.

Aqui está o arquivo plist . Basicamente, é exatamente um copiar e colar dos documentos da Apple, definido para ser executado a cada 300 segundos:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.wintr.eodemail</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/projects/eod_email/eod</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
<key>StandardOutPath</key>
    <string>/var/log/eod-email.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/eod-email.log</string>
    <key>Debug</key>
    <true/>
</dict>
</plist>

Este é o erro que recebo em /var/log/system.log :

Jul 22 10:55:52 Nick-Cox com.apple.xpc.launchd[1] (com.wintr.eodemail[7097]): Service could not initialize: 14E46: xpcproxy + 13421 [1402][7D917364-B96E-3F93-B923-A89B5BF5736D]: 0x2

O que eu fiz:

  • Tem as mesmas permissões que o restante dos arquivos em / Library / LaunchDaemons ( -rw-r--r-- , de propriedade do root)
  • Eu li o docs para o xpc , mas isso não ajudou muito.
  • Assegurei-me de que o script Node.js fosse adequadamente permissivo (777) e executável a partir da linha de comando (é).
  • Tentei o caminho absoluto para o arquivo ( /Users/nickcox/projects/eod_email/eod ) e verifiquei se eu corria launchctl unload (daemonname) e launchctl load (daemon name)

Isso parece muito mais complicado do que o cron, que aparentemente é obsoleto, de acordo com os documentos da Apple. O que preciso fazer para que esse script seja executado em um cronograma?

    
por nickcoxdotme 22.07.2015 / 20:02

2 respostas

5

Começar a usar o launchctl definitivamente pode ser uma experiência frustrante. Eu encontrei muitos artigos explicando o que você deve fazer, mas poucas amostras para download. Aqui está um LaunchDaemon simples que esperamos ser um bom ponto de partida. Você pode apenas baixar os arquivos aqui se não quiser copiar e colar.

Observação: você precisa substituir MY_USER_NAME pelo seu nome de usuário. O plist precisa encontrar seu script.

// at ~/Desktop/testdaemon/com.wintr.eodemail.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.wintr.eodemail</string>
    <key>Program</key>
    <string>/Users/MY_USER_NAME/Desktop/testdaemon/testdaemon.sh</string>
    <key>StandardErrorPath</key>
    <string>/var/log/eod-email.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/eod-email.log</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>15</integer>
</dict>
</plist>

Este é um script de daemon simples que anexará o datetime a um arquivo em sua área de trabalho. Observação: como o script é executado como root, o til (~) não será o diretório inicial esperado.

// at ~/Desktop/testdaemon/testdaemon.sh
#!/bin/sh
home="/Users/MYUSERNAME" ## note -- this will be run as root, ~ is not your normal user
now=$(date "+%Y-%m-%d %H.%M.%S")
echo $now >> "$home/Desktop/TestFile.txt"

Finalmente, eu sempre escrevo um pequeno shell script para instalar o LaunchDaemons, já que é fácil cometer um erro. Como o launchctl executa seu script como root, é necessário que as permissões do script não sejam graváveis por outras pessoas, uma vez que isso basicamente lhes dará privilégios de root.

// ~/Desktop/testdaemon/install.sh
#!/bin/sh -e
plist_path="com.wintr.eodemail.plist"
plist_filename=$(basename "$plist_path")
install_path="/Library/LaunchDaemons/$plist_filename"

echo "installing launchctl plist: $plist_path --> $install_path"
sudo cp -f "$plist_path" "$install_path"
sudo chown root "$install_path"
sudo chmod 644 "$install_path"

sudo launchctl unload "$install_path"
sudo launchctl load "$install_path"

echo "to check if it's running, run this command: sudo launchctl list | grep wintr"
echo "to uninstall, run this command: sudo launchctl unload \"$install_path\""
    
por 16.10.2015 / 19:01
-1

Ajudaria se você pudesse colar a saída de launchctl list | grep 'com.wintr.eodemail' .

Além disso, verifique seu arquivo /var/log/eod-email.log . Isso pode lhe dar erros exatos.

Eu recomendo instalar o brew cask install launchcontrol , que é uma ferramenta GUI para o launchctl, ele pode ajudar a detectar erros e solucionar problemas.

    
por 22.10.2018 / 11:54