エラーをファイルに追加し、nohupを使用するスクリプトを実行する

エラーをファイルに追加し、nohupを使用するスクリプトを実行する

スクリプトは動作します!

まず、CLI に次のように入力します。php worker.php >>/home/xxx/log 2>&1 次に、これを独自のプロセスとして実行したいので、&次のように最後に を追加します。php worker.php >>/home/xxx/log 2>&1 &

しかし、今は何も追加されていないため、スクリプトは実行されません。/home/xxx/log確認すると、ps -fuxスクリプトはまだそこにあります。

理解できないことの 1 つは、最後のコマンドを実行すると次の結果が表示されることです。

xxx@xxx:/path$ php worker.php >>/home/xxx/log 2>&1 &
[1] 10659

後でシェルからログアウトしようとすると、次のように表示されます。

xxx@xxx:/path$ logout
There are stopped jobs.

[1]+  Stopped                 php worker.php >> /home/xxx/log 2>&1

ここで何が起こっているのでしょうか? 私が望んでいるのは、バックグラウンドでスクリプトを実行し、すべての出力をファイルに追加することだけです。

ありがとう!

編集:

ここに例があります。

user@box:~/nohuptest$ vim worker.php
user@box:~/nohuptest$ touch log
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[1] 31523
user@box:~/nohuptest$ cat log

[1]+  Stopped                 php worker.php >> log 2>&1
user@box:~/nohuptest$ php worker.php >> log 2>&1 &
[2] 31626
user@box:~/nohuptest$ cat log

[2]+  Stopped                 php worker.php >> log 2>&1
user@box:~/nohuptest$
user@box:~/nohuptest$ cat worker.php
<?php
echo "hello world\n";
?>
user@box:~/nohuptest$

答え1

どこかにタイプミスか何かがあると思います。あなたが説明している内容は完璧に機能するはずです:

$ cat worker.php
<?
echo "hello world\n"
?>
$ php worker.php >> log 2>&1 &
[1] 16353
$ cat log
hello world
$ php worker.php >> log 2>&1 &
$ cat log
hello world
hello world

この例を試してみて、動作するかどうか教えてください。


は、バックグラウンドでジョブを開始したことを通知する[1] 16353だけです。bashプロセスID16353 の。

答え2

私の推測では、あなたのプログラムが tty を開いているのでしょう。それを実行するのはあなたではなく、PHP 自体かもしれません。

試す:

php worker.php </dev/null >>/home/xxx/log 2>&1 &

それでもうまくいかない場合は、いつでも tmux/screen で実行できます。

tmux [enter]
php worker.php </dev/null >>/home/xxx/log 2>&1
[CTRL-b][d]

おそらくスクリプトを使用して実行することもできます:

echo "php worker.php >>/home/xxx/log 2>&1" | script &

答え3

解決策を見つけました。

php script.php [args] </dev/null >>/path/to/log 2>&1 &

PHP は入力を待っていました... php.ini ファイルでこれを修正できるかどうかはわかりませんが、今のところは動作します...

関連情報