![LaunchDaemon 脚本未发送邮件](https://linux22.com/image/1553112/LaunchDaemon%20%E8%84%9A%E6%9C%AC%E6%9C%AA%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6.png)
在我的 macOS 10.13 系统上,我有一个 bash 脚本作为 LaunchDaemon(位于 /Library/LaunchDaemons)每分钟启动一次,以检查 Ubuntu 虚拟机是否正在 VMware Fusion 中运行。(如果发生断电或其他情况,我必须以自己的身份登录才能让虚拟机再次运行。)我已将 Postfix 设置为中继到我的电子邮件提供商。我的脚本在前台进程中运行时工作正常,无论是作为我的普通用户还是 root 用户,都可以根据需要向我发送电子邮件或不发送电子邮件,但是当由 launchd 运行时,它不会向我发送邮件。我跟踪了 /var/log/mail.log,除了通常的守护进程启动和退出消息外,什么也没看到。我还通过将邮件命令回显到日志文件来验证其返回状态为 0。有什么建议吗?或者如何进一步调试?
我的 plist 在 /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>
我的脚本:
#!/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
答案1
当 launchd 管理的进程(如您的脚本)退出时,launchd 将“清理”(即终止)任何剩余的子进程。我不确定细节,但显然这可能包括 /usr/bin/mail 在后台触发以发送消息的某些内容。根据我的经验,launchd 通常会在发送完消息之前将其终止。解决方案:告诉 launchd不是通过将其添加到启动守护进程 plist 来终止剩余的子进程:
<key>AbandonProcessGroup</key>
<true/>