是什么阻止我在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第一个命令的作品。

如果我在root的crontab中使用/opt/local/bin/logcheck.sh ,则第一个命令起作用。

如果我扔在脚本echo "$(whoami)" > /Users/myuser/launchduser我看到它确实是由root运行。

为什么我没有在launchd中获得第一个命令的邮件? 这是pipe道的邮件权限问题?

我最近一直在自己做这个工作,并且在系统日志( /var/log/system.log )中find了显示与这个问题有关的错误的条目,比如:

 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脚本和预期的电子邮件在命令行执行时是完美的,并且在通过LaunchDaemon脚本使用launchd启动时,logcheck脚本正在执行其function。

但是,使用launchd时邮件从未到达。 上面的错误以及其他许多涉及postfix和sendmail的错误表明,sendmailsubprocess正在被launchd(作为其垃圾收集例程的一部分)终止,然后才有时间完成。

我向我的plist添加了下面的关键字:

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

当使用launchd时邮件开始stream动。 不幸的是,我仍然在我的system.log中得到了stream浪的进程/死的工作消息,目前我正在努力消除这个消息。 我已经为我的logcheck.sh脚本添加了sleep 120行,这减less了但是并没有消除这些消息。 我可以延长logcheck.sh中的睡眠命令的时间,以便脚本持续更长时间,但是我不喜欢这种特殊的“黑客”,并希望find一个更优雅的解决scheme。 我相信launchd不会开始它的垃圾收集,直到logcheck.sh过程完成后….

我要试着明确地延长控制plist中的TimeOut键,看看效果是否更好。

出于好奇,当你的脚本成功发送报告时,这些机构是空的吗?

我只是问,因为如果/ Users / myuser / report是可写的,即使您不能读取$ TMPDIR / checkreport。$$,您的解决方法总是会生成一个电子邮件。 身体将是空的,但你会得到适当的主题行的电子邮件。

当你运行这样的事情时会发生什么?

 if [ -r $TMPDIR/checkreport.$$ ]; then <$TMPDIR/checkreport.$$ $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN else echo "Unable to read file: $TMPDIR/checkreport.$$" | $MAIL -s "ERROR: $HOSTNAME $DATE system check" $SYSADMIN fi 

如果$ TMPDIR / checkreport。$$存在并且是可读的,这将只尝试发送报告电子邮件,否则您应该收到一封电子邮件,告诉您无法读取的显式文件名,您可以从中进行调查。

作为一个方面的说明,我只是删除了cat命令,因为它加速了一个不必要的过程。 最终结果将是相同的,但只是将文件内容直接redirect到您的邮件命令,而不是将猫的输出传送给它。

你的ls输出清楚地表明你的用户不能input $ TMPDIR ,所以他不能读取文件,即使它是可读的。

正如已经指出的那样,即使无法进入临时目录,您的第二个黑客程序也会创build一个空文件…所以邮件到达,但是是空的。

你应该

  • 将您的用户添加到pipe理员组
  • 使$ TMPDIR g + rXs

为了使文件对用户可用。