PHP
キューでリッスンするスクリプトがあります。理論的には、死ぬことは想定されていません。それがまだ実行されているかどうかを確認するための何かがありますか?のようなRuby's God ( http://god.rubyforge.org/ )
ものPHP
?
神は言語にとらわれませんが、Windowsでも機能するソリューションがあればいいのですが。
PHP
キューでリッスンするスクリプトがあります。理論的には、死ぬことは想定されていません。それがまだ実行されているかどうかを確認するための何かがありますか?のようなRuby's God ( http://god.rubyforge.org/ )
ものPHP
?
神は言語にとらわれませんが、Windowsでも機能するソリューションがあればいいのですが。
スクリプトが実行されているかどうかを確認したいという同じ問題がありました。だから私はこれを思いつき、cronジョブとして実行しました。実行中のプロセスを配列として取得し、各行を循環してファイル名をチェックします。うまくいくようです。#user# をスクリプト ユーザーに置き換えます。
exec("ps -U #user# -u #user# u", $output, $result);
foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
Linux では、次のように ps を実行します。
ps -C php -f
その後、phpスクリプトで行うことができます:
$output = shell_exec('ps -C php -f');
if (strpos($output, "php my_script.php")===false) {
shell_exec('php my_script.php > /dev/null 2>&1 &');
}
上記のコードは、完全に実行されているすべての php プロセスをリストし、「my_script.php」が実行中のプロセスのリストにあるかどうかを確認します。そうでない場合は、プロセスを実行し、プロセスが終了するのを待たずに処理を続行します。をしていました。
スクリプトの後に 2 つ目のコマンドを追加するだけです。停止すると、2 番目のコマンドが呼び出されます。例えば。:
php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org
技術的には、これはメーラーをすぐに呼び出しますが、php スクリプトが終了したときにのみコマンドを完了します。これを行うと、php-script の出力がキャプチャされ、メール本文に含まれます。これは、スクリプトが停止した原因をデバッグするのに役立ちます。
シンプルな bash スクリプト
#!/bin/bash
while [true]; do
if ! pidof -x script.php;
then
php script.php &
fi
done
Windows用ではありませんが...
シェルスクリプトでラップされた、実行時間の長いPHPスクリプトがいくつかあります。必要に応じて、シェル スクリプトでチェックされるスクリプトから値を返し、終了するか、すぐに再起動するか、数秒間スリープしてから再起動することができます。
これは、手動で停止するまで PHP スクリプトを実行し続ける単純なものです。
#!/ビン/バッシュ クリア 日にち php -f cli-SCRIPT.php echo "少々お待ちください..."; 睡眠 10 エグゼクティブ $0
「exec $0」は、後で解明する必要があるサブプロセスを作成せずに、スクリプトを再起動します (その間にリソースを消費します)。この bash スクリプトはメール送信者をラップするので、終了して一時停止しても問題ありません。
crontab に次のように記述できます。
0 3 * * * /usr/bin/php -f /home/test/test.php my_special_cron
test.php ファイルは次のようになります。
<?php
php_sapi_name() == 'cli' || exit;
if($argv[1]) {
substr_count(shell_exec('ps -ax'), $argv[1]) < 3 || exit;
}
// your code here
my-special-cron
そうすれば、プロセス キーとしてcron ジョブのアクティブなインスタンスを 1 つだけ持つことができます。したがって、同じ php ファイル内にさらにジョブを追加できます。
test.php system_send_emails sendEmails
test.php system_create_orders orderExport
Justin Levene の回答から着想を得てps -C
、Mac では機能しないため改善しました。これは私の場合に必要です。Mac OS X 10.11.4 と Ubuntu 14.04 の両方でテストされているため、php スクリプトでこれを使用できます (デーモンが必要になる直前かもしれません)。
$daemonPath = "FULL_PATH_TO_DAEMON";
$runningPhpProcessesOfDaemon = (int) shell_exec("ps aux | grep -c '[p]hp ".$daemonPath."'");
if ($runningPhpProcessesOfDaemon === 0) {
shell_exec('php ' . $daemonPath . ' > /dev/null 2>&1 &');
}
小さいながらも役立つ詳細: なぜgrep -c '[p]hp ...'
代わりにgrep -c 'php ...'
?
プロセスgrep -c 'php ...'
をカウントしている間、パターンに適合するプロセスとしてカウントされるためです。そのため、php の最初の文字に正規表現を使用すると、コマンドが検索するパターンとは異なります。
troelskn さんが書きました:
スクリプトの後に 2 つ目のコマンドを追加するだけです。停止すると、2 番目のコマンドが呼び出されます。例えば。:
php daemon.php | mail -s "Daemon stopped" you@example.org
これはmail
、daemon.php に行が出力されるたびに呼び出されます (これは絶対に実行されるべきではありませんが、それでも実行されます)。
代わりに、2 つのアンパサンド演算子を使用してコマンドを区切ります。
php daemon.php & mail -s "Daemon stopped" you@example.org
考えられる解決策の 1 つは、ソケット関数を使用してポートをリッスンすることです。簡単なスクリプトを使用して、ソケットがまだリッスンしていることを確認できます。pingdom のような監視サービスでも、その状態を監視できます。死ぬと、ソケットはリッスンしなくなります。
たくさんの解決策..頑張ってください。
PHP スクリプトを直接確認できない場合は、簡単なラッパーを作成して確認できます。Windows スクリプトについては、ここでその方法を説明できるほど詳しくありませんが、Bash では次のようになります...
wrapper_for_test_php.sh
#!/bin/bash
php test.php
次に、他の bash スクリプトをチェックするのと同じように、ラッパーをチェックします: pidof -x wrapper_for_test_php.sh
スクリプトを使用している場合は、db で X 回ごとに時間値を設定するように彼に依頼し、その値が最新かどうかを cron ジョブに確認させることができます。