Shell Script Variable Bug?

时间:2010-09-06 19:16:37

标签: shell

你好慷慨的电脑主义者!

所以我有一个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>

我很想听听人们是否认为这是正确的。非常感谢!

1 个答案:

答案 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