shell脚本来检查另一个脚本的状态并重新启动它

问题描述:

我想有一个运行无限和不断检查PHP脚本(比如my.php)的状态,并重新启动它如果脚本莫名其妙地终止的壳素文字。我有这个想法去 -shell脚本来检查另一个脚本的状态并重新启动它

ps -aux | grep "my.php" 

,然后用这个结果来检查状态,并做相应处理。提前致谢。

+1

如果你的系统有`pgrep`,它更容易一大堆使用。 – 2011-01-06 19:50:01

你可以简单地说:

ps -aux | grep -q "my.php" || php -f my.php 

它的工作方式是,grep -q不会输出任何东西,但将返回一个“OK”退出代码,如果它发现了什么。当它返回一个“不OK”退出代码,在||之后的部分(“或”)被执行(因为布尔短路评价 - 看它)。

你还需要确保:

  1. 你在后台运行新的脚本,并从控制台取下它,这样你的脚本就可以随时监控

  2. 当您运行ps | grep有时PS还列出您的grep,然后grep的“里grep本身”,所以你要筛选了这一点。

它应该是这个样子:

while true 
    ps -aux | grep -v grep | grep -q "my.php" || (nohup php -f "my.php" &) 
    sleep 1 
done 

或一些,这样..

+0

如果ps -aux列出“my.php”但是T状态会怎么样? – ayush 2011-01-06 19:45:19

+0

“T”是指某人发送它-STOP信号 - 这通常发生在目的:该脚本悬浮在背景中,或正在调试。当这种情况发生时,你不想去开始第二个过程,因为脚本可能会在一会儿继续。 – Guss 2011-01-06 19:47:36

另一种方法是,在一个循环开始你的PHP程序:

for ((;;)) 
do 
    my.php 
done 

使用Linux ps的,你可以使用

ps -C "my.php" 

代替的grep,以确定my.php。 Grep命令经常会发现自己。也许你的PS有类似的开关?

如果你真的觉得有必要给grep的ps输出,当心你的grep,发现自己。

[[email protected] ~]$ sleep 60 & 
[1] 66677 
[[email protected] ~]$ ps aux | grep sleep 
ghoti  66677 0.0 0.0 3928 784 11 S  4:11PM  0:00.00 sleep 60 
ghoti  66681 0.0 0.0 16440 1348 11 S+ 4:12PM  0:00.00 grep sleep 
[[email protected] ~]$ 

有一个简单的方法可以避免这种情况。只要将你的grep的一部分变成更复杂的正则表达式。

[[email protected] ~]$ sleep 60 & 
[2] 66717 
[[email protected] ~]$ ps aux | grep '[s]leep' 
ghoti  66677 0.0 0.0 3928 784 11 S  4:11PM  0:00.00 sleep 60 
ghoti  66717 0.0 0.0 3928 784 11 S  4:13PM  0:00.00 sleep 60 
[[email protected] ~]$ 

在另一方面,如果你只是想确保你的PHP脚本始终运行,你可以在一些包裹它,当它死重新运行它:

while true; do 
    php /path/to/my.php 
done 

如果您希望这种情况在启动时运行,你可以在服务器上编辑你的crontab,并使用@reboot标签,假设你使用“的Vixie”的cron(常见于Linux和BSD):

@reboot /path/to/wrapperscript 

您可以man crontabman 5 crontab有关如何使用cron更多的细节和@reboot标签。