web-dev-qa-db-ja.com

phpスクリプトを実行している監視対象の「終了ステータス1は予期されていません」

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状態になります。

8
Luciano

終了コード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からユーザーに変更するか(これはお勧めしません)、プロジェクトの場所をホームディレクトリの下にない別のフォルダーに変更してみてください。

13
skroczek

startsecs = 0を設定してみてください:

[program:foo]
command = ls
startsecs = 0
autorestart = false
http://supervisord.org/configuration.html

startsecs

起動が成功したと見なすために、起動後にプログラムが実行を継続する必要がある合計秒数。プログラムが起動してからこの数秒間起動しない場合、「予期された」終了コード(exitcodesを参照)で終了しても、起動は失敗と見なされます。 0に設定すると、プログラムを特定の時間実行し続ける必要がないことを示します。

0
Andy Wong

私はしばらく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;

そしてそれを監督に追加します。エコーを行った後、再起動する必要があります。

0
N.B.