2011-01-06 12 views
1

シェルスクリプトを無限に実行し、PHPスクリプト(my.phpなど)の状態をチェックし続け、スクリプトが何らかの理由で終了した場合は再起動します。私は行く考えを持っています -他のスクリプトの状態を確認して再起動するシェルスクリプト

ps -aux | grep "my.php" 

この結果を使って状態を確認し、それに応じて行います。前もって感謝します。

+1

システムに 'pgrep'がある場合は、使い方が簡単です。 –

答えて

3

あなたは、単に言うことができます:それは動作します

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

方法はgrep -qはないでしょう何も出力が、それは何かを発見した場合は、「OK」終了コードを返すことです。 "NOT OK"の終了コードを返すと、||( "or")の後の部分が実行されます(ブールの短絡評価のため、参照してください)。

あなたはまた、ことを確認する必要があります。

  1. あなたがバックグラウンドで新しいスクリプトを実行し、時にはps | grepを実行したときにスクリプトが

  2. を監視し続けることができるように、あなたのコンソールからそれを切り離しますpsはまたあなたのgrepをリストし、grepは "greps自身"をフィルタリングする必要があります。

それは次のようになります。

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

+0

"T"は、誰かがそれに-STOPシグナルを送信したことを意味します。これは通常、意図的に発生します。スクリプトはバックグラウンドで中断されていたか、デバッグ中です。スクリプトが一瞬のうちに続行される可能性があるため、そのような場合には2番目のプロセスを開始する必要はありません。 – Guss

1

別のアプローチで、ループ内であなたのphp-プログラムを開始します。

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

Linux psの場合、

ps -C "my.php" 

my.phpを識別するために、grepの代わりに。 Grepコマンドはしばしば自分自身を見つけます。多分あなたのPSにも同様のスイッチがありますか?

+0

私はどのオペレーティングシステムを使用しているのかわかりませんが、私の場合、-Cは "常駐"時間 "*"を無視した "未処理の" CPU計算を使用してCPUパーセンテージを計算する方法を変更します。 OPの質問がPHPとシェルに関するものであれば、PHPとシェルの観点から質問に答えてください。他のコマンドの特有の風味ではありません。 – ghoti

+0

私はLinuxを使用していますが、psのマンページによれば、このpsは以下を受け入れています: 1)単一Unix仕様のバージョン2、2)Open Group技術標準仕様、Issue 6,3)IEEE Std 1003.1,2004 Edition、4)X/Open System Interfaces Extension [UP XSI]、5)ISO/IEC 9945:2003' - 十分だと思いました。 –

+1

私たちが知っているのは、OPのオペレーティングシステムは、SystemVのオプションではなく、 'ps'のバークレースタイルのオプションを使用しているということだけです。 – ghoti

1

実際にgrepの出力をpsとgrepする必要があると感じる場合は、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の一部をより複雑な正規表現にするだけです。それは死ぬときあなたは自分のPHPスクリプトが常に実行されることを確認する場合は、あなたが何かでそれをラップすることができます一方

[[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] ~]$ 

、それを再実行します:

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

あなたの場合これは起動時に実行するために、サーバー上であなたのcrontabを編集することができ、あなたが「いるVixie」のcron(LinuxやBSDに共通)を使用していると仮定すると、@rebootタグを使いたい:

@reboot /path/to/wrapperscript 

あなたがすることができますcronと@rebootタグの使用方法の詳細は、man 5 crontabです。

関連する問題