2010-11-28 51 views
16

據我所知,這些書和bash手冊就是這樣。當用戶從bash註銷時,如果用戶不使用nohup或disown,用戶啓動的所有後臺作業都將自動終止。但是今天我測試了它:註銷時bash如何處理作業?

  1. 登錄到我的gnome桌面並訪問了gnome-terminal。
  2. 有終端兩個選項卡和一個我創建了一個新的用戶名爲測試,並記錄在作爲測試

    su - test 
    
  3. 啓動的腳本。

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. 之後,我註銷測試和關閉的選項卡

  5. 在接下來的標籤我exected的ps aux爲根,發現作業仍在運行。

這是怎麼發生的?

+0

我注意到這個問題,目前還沒有一個公認的答案,並且有上[蘇]類似的新問題,這可能是有趣的閱讀:HTTP:// superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-shell-is-exited](http://superuser.com/questions/662431/what - 完全確定 - 如果一個後臺工作被殺 - 當這個shell被退出) – Hennes 2013-10-21 16:13:05

回答

2

只有交互式shell在關閉它們時纔會終止作業。其他shell(例如你使用su - username得到的那些)不會這樣做。而交互式shell只會殺死直接的子進程。

+0

我沒有`su`的mac上的相同技巧。 – khachik 2010-11-28 20:23:11

+0

什麼是交互式shell? – Unni 2010-11-28 20:35:42

12

運行後臺作業在退出時是否終止取決於shell。 Bash通常不會這樣做,但可以配置爲登錄shell(shopt -s huponexit)。無論如何,在控制過程(例如登錄shell)終止之後,不可能訪問tty。

情況那些總是引起SIGHUP包括:在前臺

  • 凡是當tty被關閉。 (SIGCONTSIGHUP)。在發生這種情況之前,殼通常會提醒你。

huponexit摘要:

$ 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