Phpスクリプトを実行するようにスーパーバイザーを構成しようとすると問題が発生します。スーパーバイザーをデバッグモードで実行すると、次のようになります。
2015-03-09 08:53:06,342 INFO supervisord started with pid 2030
2015-03-09 08:53:06,358 INFO spawned: 'worker1' with pid 2031
2015-03-09 08:53:06,423 INFO exited: worker1 (exit status 1; not expected)
2015-03-09 08:53:06,424 INFO received SIGCLD indicating a child quit
2015-03-09 08:53:07,440 INFO spawned: 'worker1' with pid 2032
2015-03-09 08:53:07,587 INFO exited: worker1 (exit status 1; not expected)
2015-03-09 08:53:07,589 INFO received SIGCLD indicating a child quit
2015-03-09 08:53:09,604 INFO spawned: 'worker1' with pid 2033
2015-03-09 08:53:09,756 INFO exited: worker1 (exit status 1; not expected)
2015-03-09 08:53:09,758 INFO received SIGCLD indicating a child quit
2015-03-09 08:53:12,775 INFO spawned: 'worker1' with pid 2034
2015-03-09 08:53:12,973 INFO exited: worker1 (exit status 1; not expected)
2015-03-09 08:53:12,974 INFO received SIGCLD indicating a child quit
2015-03-09 08:53:13,976 INFO gave up: worker1 entered FATAL state, too many start retries too quickly
監視対象の構成:
[program:worker1]
command=php myScript.php
directory=/home/path/to/script/
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/worker1.err.log
stdout_logfile=/var/log/worker1.out.log
redirect_stderr=true
environment=PATH="/usr/bin"
このテストでは、myScript.phpはecho "test".PHP_EOL;
を出力するだけです。
PHPからのエラーを報告するログはありません。また、CLIを使用してスクリプトを実行すると、期待どおりに機能します。監視対象ログは、debugginと同じ出力を報告するだけです。
/usr/bin/php /home/path/to/script/myScript.php
のような絶対パスも使用してみましたが、何も変わりません。
MyScript.phpのファイル権限は-rwxrwxr-x 1 root Apache
に設定されています
私が他に何をチェックできるか本当にわかりません。サポートをありがとう!
PDATE_1
/ bin/catやbashスクリプトなどの他のプログラムも監視しようとしましたが、これは魅力のように機能します。問題はphpに限定されているようです。
PDATE_2
N.B.としてコメントで指摘されているように、テストスクリプトを長時間実行ジョブのように変更しました。
while(true){
echo "test".PHP_EOL;
sleep(10);
}
前と同じように、FATAL状態になります。
終了コード1でこの動作を再現できる唯一の方法は、ファイルへの無効なパスを使用することです。したがって、最初にパスが正しいかどうかを再確認してください。しかし、私はあなたが以前にこれをしたと思います。
ファイルはホームディレクトリの下にあり、rootユーザーはファイルにアクセスして実行できないと思います。だから私はスクリプトの場所を変更しようとします。
テストのために、スクリプトを/tmp/myScript.php
の下に置くことができます。
cp /home/path/to/script/myScript.php /tmp/myScript.php
次のようにsupervisord設定を変更します。
[program:worker1]
command=php myScript.php
directory=/tmp/
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/worker1.err.log
stdout_logfile=/var/log/worker1.out.log
redirect_stderr=true
environment=PATH="/usr/bin"
これで、監視対象者がスクリプトを実行できるようになります。
これが機能している場合は、rootがスクリプトにアクセスできないようにするフォルダーを確認する必要があります。これは、暗号化された(およびマウントされた)フォルダー(ホームディレクトリ?)、または場所が他の場所(samba、nfs ...)からマウントされた場合に発生する可能性があります。この問題を解決するには、ユーザーをrootからユーザーに変更するか(これはお勧めしません)、プロジェクトの場所をホームディレクトリの下にない別のフォルダーに変更してみてください。
startsecs = 0
を設定してみてください:
[program:foo]
command = ls
startsecs = 0
autorestart = false
http://supervisord.org/configuration.html
startsecs
起動が成功したと見なすために、起動後にプログラムが実行を継続する必要がある合計秒数。プログラムが起動してからこの数秒間起動しない場合、「予期された」終了コード(exitcodesを参照)で終了しても、起動は失敗と見なされます。 0に設定すると、プログラムを特定の時間実行し続ける必要がないことを示します。
私はしばらくSupervisordを使用していて、これが私の設定にあるものです:
[program:worker1]
command=php /absolute/path/to/myScript.php
回答がフォーマットによるものであるため、これを書いている理由。
また、次のスクリプトを試してください。
for(i = 0; i < 10; i++)
{
printf("\nIteration: %d", $i);
usleep(1000 * 200); // 200 milliseconds between each printf
}
exit;
そしてそれを監督に追加します。エコーを行った後、再起動する必要があります。