shell脚本来检查另一个脚本的状态并重新启动它
问题描述:
我想有一个运行无限和不断检查PHP脚本(比如my.php)的状态,并重新启动它如果脚本莫名其妙地终止的壳素文字。我有这个想法去 -shell脚本来检查另一个脚本的状态并重新启动它
ps -aux | grep "my.php"
,然后用这个结果来检查状态,并做相应处理。提前致谢。
答
你可以简单地说:
ps -aux | grep -q "my.php" || php -f my.php
它的工作方式是,grep -q
不会输出任何东西,但将返回一个“OK”退出代码,如果它发现了什么。当它返回一个“不OK”退出代码,在||
之后的部分(“或”)被执行(因为布尔短路评价 - 看它)。
你还需要确保:
你在后台运行新的脚本,并从控制台取下它,这样你的脚本就可以随时监控
当您运行
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
或一些,这样..
答
另一种方法是,在一个循环开始你的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 crontab
和man 5 crontab
有关如何使用cron更多的细节和@reboot
标签。
如果你的系统有`pgrep`,它更容易一大堆使用。 – 2011-01-06 19:50:01