問題描述
- 當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/1117828bash