检查进程是否正在运行,如果没有在Terminal中再次执行它


2

有没有办法定期检查进程是否正在运行(可能使用Apple脚本或其他一些shell脚本),如果没有,那么在终端中执行它?

我有一个需要运行的PHP脚本,但经过一段时间它会中断,所以我需要再次启动它。

谢谢。



Answers:


5

在OSX中使用launchd来实现。launchd将在登录或启动时启动命令,如果进程终止,它将重新启动它。

该过程由.plist文件控制,该文件的格式与Apple文档中定义的相同,该手册页中的示例适用于您要求的情况。

  <?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>com.example.exampled</string>
        <key>ProgramArguments</key>
        <array>
             <string>exampled</string>
        </array>
        <key>KeepAlive</key>
        <true/>
   </dict>
   </plist>

如果你想在用户登录时启动这个文件,请进入〜/ Library / LaunchAgents。如果机器启动然后/ Library / LaunchDaemons(无法访问GUI),但除非您添加UserName键,否则它将以root身份运行。(感谢@Gordon Davisson的纠正和对Apple定义的重读)

为了便于设置.plist,您可以使用Mac AppStore中提供的Lingon.app


更正:在启动时运行它,将文件放在/ Library / LaunchDaemons中。
戈登戴维森

@jherran看到meta和许多元堆栈溢出 - 不要仅仅为代码使用纯文本中的代码格式
Mark

3

如果您想通过shell脚本执行此操作,我会执行以下操作:

#!/bin/sh
PROCESS=`ps A | grep PROCESS_NAME | grep -v grep`
if [ "$?" -ne "0" ]; then
        echo "not running"
        ### COMMAND TO EXECUTE HERE ###
        exit 1
fi

你可以每分钟左右通过cron调用它。


2

为什么需要主动轮询脚本?为什么不将它放在shell脚本循环中并在失败时重新启动它。

#!/bin/sh

let c=1
while ! php -f myscript.php; do
    echo "The script has crashed $c times so far..."
    let "c=c+1"
done

如果它没有正常失败,轮询正在运行的进程也不会保存。它也可以在不做任务的情况下继续运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.