是什麼阻止我在 launchd 中將“600”文件傳送到郵件中?
在 OSX 10.6 中,我通過執行 logcheck.sh。使用這個 plist 啟動
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>org.logcheck</string>
<key>Program</key><string>/opt/local/bin/logcheck.sh</string>
<key>StartInterval</key><integer>600</integer>
</dict>
</plist>
logcheck 以指定的時間間隔執行,但它不會使用以下命令向我發送郵件:
cat $TMPDIR/checkreport.$$ | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
在哪裡
$TMPDIR=/opt/local/var/tmp $MAIL=/usr/bin/mail $SYSADMIN=myuser
但是,如果我破解它,並將命令更改為:
cat $TMPDIR/checkreport.$$ > /Users/myuser/report cat /Users/myuser/report | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
然後我收到郵件。
$ls -l /opt/local/var
用我檢查 tmp 的權限drwx------ 20 root admin 680 Jul 12 13:29 tmp/
如果我執行
sudo /opt/local/bin/logcheck.sh
第一個命令有效。如果我
/opt/local/bin/logcheck.sh
在 root 的 crontab 中使用第一個命令有效。如果我輸入腳本
echo "$(whoami)" > /Users/myuser/launchduser
,我會發現它確實是由 root 執行的。**為什麼我沒有使用 launchd 中的第一個命令收到郵件?**發送郵件的管道是否存在權限問題?
我自己最近一直在處理這個問題,並在系統日誌 (
/var/log/system.log
) 中找到了顯示與此問題相關的錯誤的條目,例如:Nov 1 08:52:14 my-computer com.apple.launchd[1] (org.postfix.master[22591]): Stray process with PGID equal to this dead job: PID 22592 PPID 1 pickup Nov 1 08:52:14 my-computer com.apple.launchd[1] (org.postfix.master[22591]): Stray process with PGID equal to this dead job: PID 22594 PPID 1 cleanup
我發現我的 logcheck 腳本和預期的電子郵件在從命令行執行時執行良好,並且 logcheck 腳本在通過 LaunchDaemon 腳本使用 launchd 啟動時可以很好地執行其功能。
但是,使用
launchd
. 上述錯誤以及許多其他錯誤,涉及 postfix 和 sendmail,表明子 sendmail 程序在它們有時間完成之前被 launchd 終止(作為其垃圾收集常式的一部分?)。我將以下密鑰添加到我的 plist 中:
<key>AbandonProcessGroup</key> </true>
使用launchd時郵件開始流動。不幸的是,我仍然在我的 system.log 中收到雜散的程序/死作業消息,我目前正在努力消除這些消息。我在腳本中添加了
sleep 120
一行logcheck.sh
,這減少了但沒有消除這些消息。我可以延長 sleep 命令的時間logcheck.sh
,以便腳本持續更長時間,但我不喜歡這種特殊的“hack”,並希望找到更優雅的解決方案。我相信在 logcheck.sh 程序完成之前,launchd 不會開始它的垃圾收集……我將嘗試顯式延長控制 plist 中的 TimeOut 鍵,看看是否效果更好。