开发者

shell script to check status of another script and restart it

I would like to have a shell scipt that runs infinitely and keeps checking status of a php script (say my.php) and restarts it if the script has terminated somehow. I have the idea to go for -

ps -aux | grep "my.开发者_运维问答php"

and then use the result of this to check the status and do accordingly. Thanks in advance.


You can simply say:

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

The way it works is that grep -q will not output anything but will return an "OK" exit code if it found something. when it returns a "NOT OK" exit code, the part after the || ("or") gets executed (because of boolean short-circuit evaluation - look it up).

You also need to make sure that:

  1. you run the new script in the background and detach it from your console so that your script can keep monitoring

  2. when you run ps | grep sometimes ps also lists your grep and then the grep "greps itself", so you have to filter that out.

It should look something like this:

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

or some-such..


Another approach is, start your php-program in a loop:

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

With Linux ps, you could use

ps -C "my.php"

instead of grep, to identify my.php. Grep commands often find themselves. Maybe your ps has a similar switch?


If you DO really feel the need to grep the output of ps, beware of your grep finding itself.

[ghoti@pc ~]$ sleep 60 &
[1] 66677
[ghoti@pc ~]$ 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
[ghoti@pc ~]$

There's an easy way to avoid this. Just make part of your grep into a more complex regular expression.

[ghoti@pc ~]$ sleep 60 &
[2] 66717
[ghoti@pc ~]$ 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
[ghoti@pc ~]$ 

On the other hand, if you just want to make sure that your PHP script always runs, you can wrap it in something that re-runs it when it dies:

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

If you want this to run at startup, you can edit your crontab on the server, and use a @reboot tag, assuming you're using "Vixie" cron (common on Linux and BSD):

@reboot /path/to/wrapperscript

You can man crontab and man 5 crontab for more details on how to use cron and the @reboot tag.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜