2011-01-06 126 views
1

我想有一個運行無限和不斷檢查PHP腳本(比如my.php)的狀態,並重新啓動它如果腳本莫名其妙地終止的殼素文字。我有這個想法去 -shell腳本來檢查另一個腳本的狀態並重新啓動它

ps -aux | grep "my.php" 

,然後用這個結果來檢查狀態,並做相應處理。提前致謝。

+1

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

回答

3

你可以簡單地說:

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

1

另一種方法是,在一個循環開始你的PHP程序:

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

使用Linux ps的,你可以使用

ps -C "my.php" 

代替的grep,以確定my.php。 Grep命令經常會發現自己。也許你的PS有類似的開關?

1

如果你真的覺得有必要給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標籤。