2010-11-28 8 views
16

私が本とbashのマニュアルから理解している限り、それはそうです。ユーザーがbashからログアウトすると、nohupまたはdisownを使用していない場合、ユーザーによって開始されたすべてのバックグラウンド・ジョブが自動的に終了します。しかし、今日私はそれをテストしました:ログアウト時にbashがジョブを処理する方法は?

  1. 私のgnomeデスクトップにログインし、gnome-terminalにアクセスしました。
  2. ありつのタブがターミナル内にあり、1で、私はテストと呼ばれる新しいユーザーを作成し、スクリプトを開始したテスト

    su - test 
    
  3. としてログイン。その後

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. 私はテストのログアウトと私はルートとしてのPS補助をexected、ジョブがまだ実行されていることが判明し、次のタブでは、タブに

  5. を閉じました。

これはどのようなことですか?

+0

私はこの質問にはまだ受け入れ答えを持っているし、面白い読み物であるかもしれない[SU]に似た新しい問題があることをしないことに気づきましたsuperuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-hell-is-exited](http://superuser.com/questions/662431/what)シェルが終了したときにバックグラウンドジョブが強制終了するかどうかを正確に判断する) – Hennes

答えて

2

対話型シェルは、閉じるときにジョブを強制終了します。他のシェル(例えば、su - usernameを使用して取得したシェル)はそうしません。また、インタラクティブシェルはダイレクトサブプロセスを殺すだけです。

+0

私のマックで 'su'を使わないで同じトリック。 – khachik

+0

インタラクティブシェルとは何ですか? – Unni

+0

インタラクティブシェルとは何ですか? http://tldp.org/LDP/abs/html/intandnonint.htmlによれば、$ PS1が設定されていれば、それは対話シェルです。また、Ctrl + Alt + F2を使用して別のttyに切り替え、テストとしてログインして同じことをしました。結果は同じですが。 – Unni

12

終了時に実行中のバックグラウンドジョブが終了するかどうかは、シェルによって異なります。 Bashは通常これをしませんが、ログインシェル(shopt -s huponexit)用に設定することができます。いずれにしても、制御プロセス(ログインシェルなど)が終了した後は、ttyへのアクセスは不可能です。常にSIGHUPを起こすん

状況は以下のとおりです。フォアグラウンドで

  • 何をttyが閉鎖されたとき。
  • シェル終了時に停止したプロセスを含むバックグラウンドジョブ(SIGCONTおよびSIGHUP)。シェルは通常、これを起こさせる前に警告します。

huponexitサマリー:[ます。http://

$ shopt -s huponexit; shopt | grep huponexit 
huponexit  on 
# Background jobs will be terminated with SIGHUP when shell exits 

$ shopt -u huponexit; shopt | grep huponexit 
huponexit  off 
# Background jobs will NOT be terminated with SIGHUP when shell exits 
+2

だから、huponexitオプションが設定されていないと、bashはユーザーのバックグラウンドジョブを強制終了しません。 – Unni

+0

@Unni - 'huponexit'が設定されている場合、Bashは対話型ログインシェルが終了すると(** exit **または** Ctrl + d **のいずれかで)SIGHUPをすべてのジョブに送ります。 –

関連する問題