`> my.log 2>&1&`でジョブがログアウトし続けるのはなぜですか?

`> my.log 2>&1&`でジョブがログアウトし続けるのはなぜですか?

私は使う

myscript > my.log 2>&1 &

スクリプトを実行して出力を収集します。これにより、ログアウトしてもスクリプトは引き続き実行されます。始めましょうmyscript &。ログアウト後すぐに終了します。

しかし、これは奇妙な効果があります:> my.log 2>&1 &それがすることはstderrをstdoutにリダイレクトするだけです。

> my.log 2>&1 &ジョブがログアウトし続けるのはなぜですか?

答え1

通常、バックグラウンドに何かを置くと、親シェルが終了した後も実行され続けます。実際には、次のテストケースを作成できます。

/bin/sh -c 'while true; do echo hi; sleep 5; done' &

その後、シェルを終了してを使用すると、psシェルを終了するまで実行され続けることがわかります。

出力をリダイレクトすることと出力をリダイレクトしないことには1つの違いがあります。出力をリダイレクトせずにシェルを終了すると、stdout / stderrファイル記述子が閉じて、次に書き込もうとすると書き込み操作が失敗します。スクリプトがこれを確認している場合-e(エラーが発生した場合は終了)オプションが設定されている状態で実行されている場合、スクリプトは停止します。上記の動作をこのバージョンと比較してみてください。

/bin/sh -c 'while true; do echo hi || exit 1; sleep 5; done' &

または

/bin/sh -ec 'while true; do echo hi; sleep 5; done' &

ps実行している場合は、シェルを終了してから次のようにechoします。

出力をファイルにリダイレクトすると、明らかに書き込みは失敗しなくなり、スクリプトは引き続き実行されます。

答え2

これとは何の関係もありません> my.log 2>&1。代わりに、&finalの役割はバックグラウンドでプロセスを実行することです。コマンドを入力した後、返される行には(pid)という数字が表示されますprocess id。必要に応じて、後でこの番号をコマンドと共に使用してkillプロセスを終了できます。

それにもかかわらず、あなたの場合は、screen次のコマンドを使用できます。

screen -S <name>

その後、コマンドを実行します。画面を出るには(元の端末に戻る)とCTRLキーをA順番に押す必要がありますD。画面を再接続するには、次のように入力します。

screen -r <name>

このように(画面上でジョブを実行する)、ユーザーがログアウトまたは切断された場合でも実行され、最善の方法はreattachコマンドを使用して結果を表示できることです。

答え3

不滅プロセスとデーモンプロセスを比較してみましょう。デーモンはユーザーや端末と対話せず、initが終了すると終了します(意図的に停止しない限り)。

nohupを使用してstd.outとstd.errを/ dev / nullにリダイレクトして、「デーモンの作成」を実行できます。

nohup ping google.com 2> /dev/null> /dev/null - これは記念碑的なものです。

関連情報