爲何ssh一關閉,程序就再也不運行了?


問題描述

  • 當SSH遠程鏈接到服務器上,而後運行一個程序,eg: ./test.sh, 而後把終端開閉(切斷SSH鏈接)以後,發現該程序中斷.

緣由

  • 主要元兇: 掛斷信號(SIGHUP) 信號

概念介紹

  • 在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

相關文章
相關標籤/搜索