
スクリプトは動作します!
まず、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 ファイルでこれを修正できるかどうかはわかりませんが、今のところは動作します...