你好慷慨的电脑主义者!
所以我有一个launchd plist项,每30秒调用一次下面的shell脚本。它检查程序是否正在运行,如果没有,则重新启动它。或者至少这是它应该做的事情。
问题是,即使进程被终止,shell脚本也会声明该进程仍在运行。我认为这是因为某种程度上布尔值没有被重置(或者沿着那些行重置)。有什么帮助吗?
n=`ps -ef | grep Intel | grep -v grep | wc -l`
if [ $n -gt 0 ]
then
echo `date` CURRENTLY RUNNING. >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt
else
echo `date` not running. ATTEMPTING RESTART... >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt
cd /Library/LaunchAgents/
launchctl load com.Intel.plist
fi
编辑1
有人建议添加'Keep Alive'参数可能是解决我的一般问题的一个很好的解决方案。有什么意见吗?
这将是我更新的plist文件,它应该保证我的应用程序不断运行:
<?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.Intel</string>
<key>OnDemand</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Library/LaunchAgents/Contents/Intel</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
我很想听听人们是否认为这是正确的。非常感谢!
答案 0 :(得分:1)
要解决当前问题,请尝试记录ps
命令的输出:
processes=`ps -ef | grep [I]ntel`
if [ -n "$processes" ]
then
echo `date` CURRENTLY RUNNING. "$processes" >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt
...
我怀疑还有其他东西正在运行(甚至可能是脚本本身)与英特尔匹配;这将在日志中告诉你。
但是,我认为这是无关紧要的,因为这个脚本似乎试图解决其他地方更好解决的问题:launchd完全能够监控并重新启动它管理的进程(这是它的重要特性之一)。只需添加
<key>KeepAlive</key>
<true/>
到/Library/LaunchAgents/com.Intel.plist,并且launchd将重启程序本身。
顺便说一句,如果由于某些原因需要手动重新启动启动管理的流程,launchctl load
是错误的咒语 - 您需要launchd start
。