次の例のようなジョブを実行すると、ログアウト時にそのジョブが終了します。
$ ./job.sh &
ただし、次の例のようにstdoutをstdoutに/dev/null
、stderrをstdoutにリダイレクトしてジョブをバックグラウンドに配置して実行すると、ログアウト時にそのジョブは終了しません。出力が/dev/null
ファイルの代わりにファイルに移動することを除いて、nohupと少し似ています。
$ ./job.sh > /dev/null 2>&1 &
一部のデーモンがこのように動作することがわかり、ログアウト時になぜデーモンが終了しないのか疑問に思いました。
誰かが理由を説明できますか?
編集1:
@Patrickが自分の意見で提案したように、同じ結果で同じ単純な操作を試しました。ログアウトしてもジョブは消えません。
# while true; do sleep 1; done > /dev/null 2>&1 &
[1] 4320
# logout
luis-macbook:~ luis$
luis-macbook:Downloads luis$ ssh server
luis.alen@server's password:
# jobs
#
# ps -ef | grep 4320
root 4320 1 0 01:17 ? 00:00:00 -bash
編集2:
Patrickが再び尋ねたときにストリームをリダイレクトせずに同じテストを実行しましたが、驚くべきことにプロセスは終了しませんでした。今は完全に混乱しています…ログアウトすると、バックグラウンドに入れておいたプロセスが消えるのを覚えています。私は完全に間違っていますか?
# while true; do sleep 1; done &
[1] 20720
# logout
luis-macbook:~ luis$ ssh server
# jobs
#
# ps -ef | grep 20720
root 20720 1 0 23:31 ? 00:00:00 -bash
ベストアンサー1
これを実行するデーモンの場合、プロセスの入出力ストリームをどのようにリダイレクトするかに関係なく、生成できるすべての出力またはエラーメッセージを削除したいので、セッションに接続されており、そのセッションはSIGHUP信号です。プロセスを実行し続けるには終了してください。
プロセスを実行し続ける方法はいくつかあります。
セッションから切り離します。デーモンは新しいプロセスをフォークし、元のプロセスを終了してこれを行います。これで、新しいプロセスには親プロセスがなく、ユーザーが採用します。
init
bash内部コマンドdisownを使用してこれを実行することもできます。セッションの終了時にプロセスがSIGHUPを受信しないようにするために使用されます
nohup
。プロセスはSIGHUPを取得できず、終了せず、親プロセスが終了し、initがそれを取得します。消えないセッションへの接続 - 画面の使用
> /dev/null 2>&1 &
「実行中にログアウトしてもジョブは終了しません」というフレーズの操作をもう一度確認してください。