Permissions

是什麼阻止我在 launchd 中將“600”文件傳送到郵件中?

  • October 4, 2015

在 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 鍵,看看是否效果更好。

引用自:https://serverfault.com/questions/159694