Script do LaunchDaemon não está enviando mensagens

0

No meu sistema macOS 10.13, eu tenho um script bash lançado como um LaunchDaemon (em / Library / LaunchDaemons) a cada minuto para verificar se uma máquina virtual Ubuntu está sendo executada no VMware Fusion. (No caso de falta de energia ou algo assim, eu preciso fazer login como eu para fazer a VM funcionar novamente.) Eu tenho o Postfix configurado para retransmitir para o meu provedor de e-mail. Meu script funciona bem quando executado em um processo de primeiro plano, como meu usuário regular ou como raiz, resultando em e-mail ou não me enviando como apropriado, mas quando executado pelo launchd, ele simplesmente não me enviará e-mails. Eu segui o /var/log/mail.log e não vejo nada além do usual daemon iniciar e sair das mensagens. Eu também verifiquei que o status de retorno do comando de email é 0, ecoando-o para um arquivo de log. Alguma sugestão como o que está acontecendo ou como depurar mais?

Meu plist em / Library / LaunchDaemons:

<?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.planetexpress.checkvmware</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/checkvmware</string>
</array>
<key>StartInterval</key>
<integer>60</integer>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

Meu script:

#!/bin/bash

touch /tmp/checkvmware
checkline="/path/to/vm.vmx"
vmwareline=$(pgrep -if "$checkline")
if [[ -z $vmwareline ]]; then
    /usr/bin/mail -s "Alert: Ubuntu on VMware isn't running" [email protected] <<< 'Are you even logged in, bro?'
    mystatus=$?
    echo "Status of mail command: $mystatus" >> /tmp/checkvmware.log
fi
stubert
fonte

Respostas:

0

Quando um processo gerenciado pelo launchd (como seu script) é encerrado, o launchd "limpará" (ou seja, matará) quaisquer subprocessos restantes. Não tenho certeza dos detalhes, mas aparentemente isso pode incluir algo que / usr / bin / mail dispara em segundo plano para enviar a mensagem. Na minha experiência, o launchd normalmente o mata antes de terminar o envio da mensagem. Solução: diga ao launchd não para matar os subprocessos restantes, adicionando isto ao daemon de lançamento plist:

<key>AbandonProcessGroup</key>
<true/>
Gordon Davisson
fonte
Ah, sim, isso faz o trabalho. Obrigado.
stubert