4

私は短いphpユーティリティスクリプトを持っています.cliから単純に実行します:

php myscript.php

スクリプトは常に実行されており、定期的にいくつかのタスクを実行しています (質問には関係ありません)。ユーザーからの入力は必要ありません。CTRLそれを実行した後、私は通常+を押しzてから実行bgし、プロセスをバックグラウンドに置きます。すべて問題ありません。

次のように実行すると:

php myscript.php &

スクリプトは開始時にバックグラウンドに置かれますが、停止状態にも置かれます。例:

[1] 11513
[1]+  Stopped                 php myscript.php

この時点で実行bgしても役に立ちません。それを機能させるには、 を実行しfg、次にCTRL+を実行する必要がzありbgます。

これはphpスクリプトです:

<?
while(true){
    echo 'hi '.time()."\n";
    sleep(30);
}
?>

私の問題は、システムが停止するため、バックグラウンドで直接実行できないことです。理由がわかりません。どうすればこれを修正できますか?

アップデート:

同じスクリプトの bash バージョンを作成しました。最後に & を付けて起動するだけで、実行してバックグラウンドで実行できます (停止せずscript.sh &に実行中) 。

script.sh:

#!/bin/bash
while true; do
    echo `date`
    sleep 30
done

バックグラウンドで起動した後にphpスクリプトが停止し、bashスクリプトが停止しないのはなぜですか? この異なる動作の原因は何ですか?

4

3 に答える 3

20

問題の原因を突き止めました。PHP では、readline モジュールが有効になっている場合、スクリプトがユーザー入力を待機しないように記述されていても、コマンド ライン スクリプトは入力を予期します。

readline サポートが有効になっているかどうかを確認するには、次を実行します。

php --info |grep "Readline Support"

出力を確認します。取得Readline Support => enabledした場合、readline が有効になっており、元の質問で説明されている問題が発生する可能性があります。

その場合に cli を使用する適切な方法は、php が入力に端末を使用していないことを明示的に指定することです。

php myscript.php < /dev/null &

詳細情報: http://php.net/manual/en/book.readline.php

代替案:

./test.php >/dev/null &    

または(より創造的):

nohup php test.php > /dev/null 2>&1 &

(ps:この質問はServerFaultに属していると思いますが、ところで..問題は解決しました!)

于 2013-07-29T16:40:10.647 に答える
0

http://php.net/manual/en/book.readline.phpから:

readline が有効になっている場合、php は端末モードを切り替えて、ラインバッファ入力を受け入れます。これは、対話型コマンドにパイプするときに cli を使用する適切な方法は、php が入力に端末を使用しないことを明示的に指定することであることを意味します。

php myscript.php < /dev/null &

ソース

于 2013-08-08T16:23:17.050 に答える