1. 在Linux/Unix中,有這樣幾個概念
進程組(process group):
? ? ? 一個或多個進程的集合,每一個進程組有唯一一個進程組ID,即進程組長進程的ID。
會話期(session):
? ? ? 一個或多個進程組的集合,有唯一一個會話期首進程(session leader)。會話期ID為首進程的ID。會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連接的會話期首進程叫做控制進程(controlling process)。當前與終端交互的進程稱為前臺進程組。其余進程組稱為后臺進程組。
2. POSIX.1 定義
1. 掛斷信號(SIGHUP)默認的動作是終止程序。
2. 當終端接口檢測到網絡連接斷開,將掛斷信號發送給控制進程(會話期首進程)。
3. 如果會話期首進程終止,則該信號發送到該會話期前臺進程組。
4. 一個進程退出導致一個孤兒進程組中產生時,如果任意一個孤兒進程組進程處于STOP狀態,發送SIGHUP和SIGCONT信號到該進程組中所有進程。
5. 因此當網絡斷開或終端窗口關閉后,控制進程收到SIGHUP信號退出,會導致該會話期內其他進程退出。
3. 解決方式
? ? ? 如果我們可以忽略SIGHUP信號,關掉窗口應該就不會影響程序的運行了。nohup命令可以達到這個目的,如果程序的標準輸出/標準錯誤是終端,nohup默認將其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信號,還需要使用標記&把它放在后臺運行。
nohup [argument…] &