В моей системе MacOS 10.13 у меня есть скрипт bash, запускаемый как LaunchDaemon (в /Library /LaunchDaemons) каждую минуту, чтобы проверить, работает ли виртуальная машина Ubuntu в VMware Fusion. (В случае отключения электричества или чего-то еще, я должен войти в систему как я, чтобы снова запустить ВМ.) У меня есть Postfix, настроенный для передачи моему провайдеру электронной почты. Мой скрипт отлично работает при запуске в процессе переднего плана, либо в качестве обычного пользователя, либо в качестве пользователя root, что приводит к тому, что я отправляю или не отправляю мне электронные письма соответствующим образом, но при запуске launchd он просто не отправляет мне почту. Я следил за /var/log/mail.log и не вижу ничего, кроме обычных сообщений запуска и выхода демона. Я также проверил, что статус возврата почтовой команды равен 0, отражая ее в файле журнала. Любые предложения о том, что происходит, или как отлаживать дальше?

Мой список в / Библиотека / 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>

Мой сценарий:

#!/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" bbrodriguez@planetexpress.com <<< 'Are you even logged in, bro?'
    mystatus=$?
    echo "Status of mail command: $mystatus" >> /tmp/checkvmware.log
fi

1 ответ1

0

Когда завершается процесс, управляемый launchd (например, ваш скрипт), launchd "очистит" (т.е. убьет) любые оставшиеся подпроцессы. Я не уверен в деталях, но, очевидно, это может включать в себя то, что /usr /bin /mail запускается в фоновом режиме для отправки сообщения. По моему опыту, launchd обычно убивает его до того, как заканчивает отправку сообщения. Решение: скажите launchd не уничтожать оставшиеся подпроцессы, добавив это в plist демона запуска:

<key>AbandonProcessGroup</key>
<true/>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .