7

PHPキューでリッスンするスクリプトがあります。理論的には、死ぬことは想定されていません。それがまだ実行されているかどうかを確認するための何かがありますか?のようなRuby's God ( http://god.rubyforge.org/ )ものPHP

神は言語にとらわれませんが、Windowsでも機能するソリューションがあればいいのですが。

4

13 に答える 13

12

スクリプトが実行されているかどうかを確認したいという同じ問題がありました。だから私はこれを思いつき、cronジョブとして実行しました。実行中のプロセスを配列として取得し、各行を循環してファイル名をチェックします。うまくいくようです。#user# をスクリプト ユーザーに置き換えます。

exec("ps -U #user# -u #user# u", $output, $result);
foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
于 2011-12-11T17:07:49.720 に答える
11

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」が実行中のプロセスのリストにあるかどうかを確認します。そうでない場合は、プロセスを実行し、プロセスが終了するのを待たずに処理を続行します。をしていました。

于 2015-09-09T11:25:59.523 に答える
5

スクリプトの後に 2 つ目のコマンドを追加するだけです。停止すると、2 番目のコマンドが呼び出されます。例えば。:

php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org

編集:

技術的には、これはメーラーをすぐに呼び出しますが、php スクリプトが終了したときにのみコマンドを完了します。これを行うと、php-script の出力がキャプチャされ、メール本文に含まれます。これは、スクリプトが停止した原因をデバッグするのに役立ちます。

于 2008-09-23T15:25:57.777 に答える
3

シンプルな bash スクリプト

#!/bin/bash
while [true]; do
    if ! pidof -x script.php;
    then
        php script.php &
    fi
done
于 2008-09-22T20:11:07.397 に答える
2

Windows用ではありませんが...

シェルスクリプトでラップされた、実行時間の長いPHPスクリプトがいくつかあります。必要に応じて、シェル スクリプトでチェックされるスクリプトから値を返し、終了するか、すぐに再起動するか、数秒間スリープしてから再起動することができます。

これは、手動で停止するまで PHP スクリプトを実行し続ける単純なものです。

#!/ビン/バッシュ
クリア
日にち
php -f cli-SCRIPT.php
echo "少々お待ちください..."; 睡眠 10
エグゼクティブ $0

「exec $0」は、後で解明する必要があるサブプロセスを作成せずに、スクリプトを再起動します (その間にリソースを消費します)。この bash スクリプトはメール送信者をラップするので、終了して一時停止しても問題ありません。

于 2008-09-23T12:13:39.923 に答える
1

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

于 2015-11-17T15:51:22.030 に答える
1

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 の最初の文字に正規表現を使用すると、コマンドが検索するパターンとは異なります。

于 2016-04-01T05:00:28.707 に答える
0

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
于 2008-09-23T17:46:04.587 に答える
0

考えられる解決策の 1 つは、ソケット関数を使用してポートをリッスンすることです。簡単なスクリプトを使用して、ソケットがまだリッスンしていることを確認できます。pingdom のような監視サービスでも、その状態を監視できます。死ぬと、ソケットはリッスンしなくなります。

たくさんの解決策..頑張ってください。

于 2008-09-22T20:43:34.417 に答える
0

PHP スクリプトを直接確認できない場合は、簡単なラッパーを作成して確認できます。Windows スクリプトについては、ここでその方法を説明できるほど詳しくありませんが、Bash では次のようになります...

wrapper_for_test_php.sh

#!/bin/bash
php test.php

次に、他の bash スクリプトをチェックするのと同じように、ラッパーをチェックします: pidof -x wrapper_for_test_php.sh

于 2016-09-22T15:00:19.647 に答える
0

スクリプトを使用している場合は、db で X 回ごとに時間値を設定するように彼に依頼し、その値が最新かどうかを cron ジョブに確認させることができます。

于 2008-09-23T15:49:57.330 に答える