同社が使用する予定のタスクはおおよそ次のとおりです:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
出力と標準エラーが空のデバイスにリダイレクトされることがわかります。これには特定の理由があります。いくつかの情報を確認したので、ここに説明します。
1. SSH 経由でサーバーにログインします。
2. 次のコードで新しい php ファイル test.php を作成します。
<?php sleep(50); echo "aaa\n"; file_put_contents("/tmp/test.txt",time());?>
3. 次のコマンドを使用して、 test.php プログラム
$ php test.php &
/tmp/test.txt ファイルの内容を 1497613738 として表示します
4. 次に、次のコマンドを再度実行します。コマンドの実行後、すぐに exit コマンドを使用してログアウトします
$ php test.php &
5 次に、ssh 経由でサーバーにログインし、/tmp/test.txt ファイルの内容がまだ 1497613738 であることを確認します。これは、test.phpを2回目に実行したときに、file_put_contents関数が実行されなかったか、正常に実行されなかったことを意味します。
6 file_put_contents関数は実行されません。 7 理由:ユーザーがログインすると、標準出力がターミナルに反映されます。標準出力のファイルハンドルは1です。したがって、phpのecho("aaan")
により、システムコールwrite(1, "aaan", 4)が実行され、ターミナルにaaanが書き込まれます。ユーザーがログアウトするとセッションは終了します。セッションの終了時に、ターミナルで開いているすべてのファイル ハンドルを読み取りおよび書き込みできないように変更します。
ユーザーがログアウトしてから write(1, "aaan", 4) を実行すると、EIO エラーが報告されます。端末ハンドルが書き込み可能ではなくなったためです。 EIO エラーが発生すると、プロセスは終了します。方法 1:
リダイレクト記号 & を使用して、標準出力をホールにリダイレクトします。 正常情况下的追踪:
strace -p
方法 2: nohup を使用します。
Process 1475 attached restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4aaa ) = 4lstat("/tmp/test.txt", 0x7ffe792ebe90) = -1 ENOENT (No such file or directory) lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR) = 0write(3, "1497614186", 10) = 10close(3) = 0munmap(0x7f4840239000, 528384) = 0close(2) = 0close(1) = 0munmap(0x7f4847510000, 4096) = 0close(0) = 0munmap(0x7f4847511000, 4096) = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936) = 0munmap(0x7f48406ce000, 2345056) = 0munmap(0x7f4840b39000, 2162536) = 0munmap(0x7f484090b000, 2282472) = 0munmap(0x7f4840d49000, 323584) = 0exit_group(0) = ? +++ exited with 0 +++[1]+ Done php test.php手順:
このコマンドは、アカウントからログアウトした後、またはターミナルを閉じた後も、対応するプロセスを実行し続けることができます。 nohup は電話を切らない (n ohang up) という意味です。
1 &の説明は別記事をご覧ください
以上がスケジュールされたタスクの PHP の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。