我想有一個運行無限和不斷檢查PHP腳本(比如my.php)的狀態,並重新啓動它如果腳本莫名其妙地終止的殼素文字。我有這個想法去 -shell腳本來檢查另一個腳本的狀態並重新啓動它
ps -aux | grep "my.php"
,然後用這個結果來檢查狀態,並做相應處理。提前致謝。
我想有一個運行無限和不斷檢查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