`> 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します。

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

おすすめ記事