bia*_*ias 5 permissions mac-osx cron launchd
在 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
Run Code Online (Sandbox Code Playgroud)
在哪里
$TMPDIR=/opt/local/var/tmp
$MAIL=/usr/bin/mail
$SYSADMIN=myuser
Run Code Online (Sandbox Code Playgroud)
但是,如果我破解它,并将命令更改为:
cat $TMPDIR/checkreport.$$ > /Users/myuser/report
cat /Users/myuser/report | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
Run Code Online (Sandbox Code Playgroud)
然后我收到邮件。
检查 tmp 的许可,$ls -l /opt/local/var
我得到
drwx------ 20 root admin 680 Jul 12 13:29 tmp/
Run Code Online (Sandbox Code Playgroud)
如果我运行sudo /opt/local/bin/logcheck.sh
第一个命令有效。
如果我/opt/local/bin/logcheck.sh
在 root 的 crontab 中使用,则第一个命令有效。
如果我输入脚本,echo "$(whoami)" > /Users/myuser/launchduser
我会看到它确实是由 root 运行的。
为什么我没有在 launchd 中使用第一个命令收到邮件?邮件管道是否存在权限问题?
小智 1
我最近自己也在研究这个问题,并在系统日志 ( /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
Run Code Online (Sandbox Code Playgroud)
我发现从命令行执行时,我的 logcheck 脚本和预期的电子邮件运行良好,并且当通过 LaunchDaemon 脚本使用 launchd 启动时,logcheck 脚本可以很好地执行其功能。
然而,使用时邮件从未到达launchd
。上述错误以及涉及 postfix 和 sendmail 的许多其他错误表明子 sendmail 进程在完成之前已被 launchd 终止(作为其垃圾收集例程的一部分?)。
我将以下键添加到我的 plist 中:
<key>AbandonProcessGroup</key>
</true>
Run Code Online (Sandbox Code Playgroud)
当使用 launchd 时邮件开始流动。不幸的是,我仍然在我的 system.log 中收到杂散进程/死作业消息,我目前正在努力消除这些消息。sleep 120
我在脚本中添加了一行logcheck.sh
,这减少了但并未消除这些消息。我可以延长 中 sleep 命令的时间logcheck.sh
,以便脚本持续更长时间,但我不喜欢这种特殊的“黑客”,并希望找到一个更优雅的解决方案。我相信 launchd 在 logcheck.sh 进程完成之前不会开始垃圾收集......
我将尝试显式延长控制 plist 中的 TimeOut 键,看看是否效果更好。