我正在使用 shell 脚本来监视 php 脚本的工作。我的目标是这个 php 脚本不应该休眠/终止,并且必须始终运行。我使用的代码是 -
ps aux | grep -v grep | grep -q $file || ( nohup php -f $file -print > /var/log/file.log & )
现在,如果 php 脚本被终止(进程状态代码 T),这个想法将不适用。任何想法来处理这种情况。是否可以永久终止此类进程然后重新启动。
当它死时重新启动php解释器怎么样?
while true ; do php -f $file -print >> /var/log/file.log ; done
当然,有人可以发送脚本 a SIGSTOP
, SIGTSTP
, SIGTTIN
,SIGTTOU
使其挂起,但也许那个人有一个很好的理由。您可以阻止所有这些,除了SIGSTOP
,所以也许没关系。
或者,如果脚本read(2)
在永远不会返回的设备或套接字上执行诸如调用之类的操作,则这并不能真正确保脚本的“活跃性”。(但是你会使用非阻塞 IO 来防止这种情况,所以这已经涵盖了。)
哦,是的,你也可以把它塞进你的 /etc/inittab。但我并没有给你更多关于这个的提示,因为我认为这可能是一个坏主意。
并且已经存在许多类似的工具:daemontools和Linux Heartbeat是最先想到的两个。
如果脚本在终止后退出,或者如果它崩溃了,需要重新启动,一个简单的 shell 脚本可以解决这个问题。
#!/bin/bash
# runScript.sh - keep a php script running
php -q -f ./cli-script.php -- $@
exec $0 $@;
使用exec $0
给定的参数重新运行 shell 脚本。
要在后台运行,您可以nohup runScript.sh
或通过 init.d 脚本、upstart、runit 或 supervisord 等运行它。