為什么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/1117828


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM