問題描述
- 當SSH遠程連接到服務器上,然后運行一個程序,eg:
./test.sh
, 然后把終端開閉(切斷SSH連接)之后,發現該程序中斷.
原因
概念介紹
- 在Linux/Unix中,有這樣幾個概念:
- 進程組(process group): 一個或多個進程的集合,每一個進程組有唯一一個進程組ID,即進程組長進程的ID.
- 會話期(session): 一個或多個進程組的集合,有唯一一個會話期首進程(session leader). 會話期ID為首進程的ID.
- 會話期可以有一個單獨的控制終端(controlling terminal).
- 與控制終端連接的會話期首進程叫做控制進程(controlling process).
- 當前與終端交互的進程稱為前台進程組.
- 其余進程組稱為后台進程組.
- 根據POSIX.1定義: 掛斷信號(SIGHUP)默認的動作是終止程序。
解釋
- 當終端接口檢測到網絡連接斷開, 將掛斷信號發送給控制進程(會話期首進程).
- 如果會話期首進程終止,則該信號發送到該會話期前台進程組.
- 一個進程退出導致一個孤兒進程組產生時, 如果任意一個孤兒進程組進程處於STOP狀態, 發送 SIGHUP 和 SIGCONT 信號到該進程組中所有進程.
- 孤兒進程參照
結論
- 因此當網絡斷開或終端窗口關閉后, 也就是SSH斷開以后, 控制進程收到 SIGHUP 信號退出, 會導致該會話期內其他進程退出.
- 簡而言之: 就是 ssh 打開以后, bash等都是他的子程序, 一旦ssh關閉, 系統將所有相關進程殺掉!! 導致一旦ssh關閉, 執行中的任務就取消了.
相關問題
為什么守護程序就算是 ssh 打開的, 關閉ssh也不會影響其運行?
- 因為他們的程序特殊, 比如httpd –k start運行這個以后, 他不屬於sshd這個進程組, 而是單獨的進程組, 所以就算關閉了ssh, 和他也沒有任何關系!
使用后台運行命令 &
能否將程序擺脫ssh進程組控制? 即關閉 ssh, 后台程序能否繼續運行?
- 只要是ssh 打開執行的一般命令,不是守護程序,無論加不加&,一旦關閉ssh,系統就會用SIGHUP終止.
如何解決方案
- 在遠端開啟
tmux
, 在 tmux
里運行程序, 此時運行的程序屬於 tmux 的進程組, 不屬於 ssh 進程組.
- 使用
nohup
命令
http://zjking.blog.51cto.com/976858/1117828