1. 程式人生 > >使用Screen管理遠端會話

使用Screen管理遠端會話

​ 在本地開發時,經常需要使用遠端連線到Linux伺服器,一開始我自己都是有幾個遠端就開幾個SSH視窗,這種方法很原始很直接,但每次都受夠了密碼輸入,即使用了SSH免密碼登入,也會覺得每次輸入SSH的命令一點都不快速,況且況且視窗開多了,也會很混亂,不易管理,這種情況,Linux上的工具也有很多,今天就學習一下screen工具。

​ 在介紹screen工具時,先討論一下,為什麼連線伺服器後,當執行長時間的任務時,我們關閉遠端連線視窗,這個任務就被殺掉了呢?

元凶:SIGUP訊號

​ 在Linux/Unix中,有以下幾個概念:

  • 程序組(process group):一個或多個程序的集合,每個程序組都有一個唯一的程序組ID;

  • 會話期(session):一個或多個程序組的集合,有唯一一個會話首程序(session leader),會話期ID為首程序ID;

  • 會話期可以有一個單獨的會話終端,與控制終端連線的會話期首程序叫控制程序(controlling process),當前與終端互動的程序稱為前臺程序組,其餘程序組稱為後臺程序組。

​工具POSIX.1定義:

  • 結束通話訊號(SIGHUP)預設的動作是終止程式;

  • 當終端介面檢測到網路連線斷開,將傳送SIGHUP訊號給控制程序(會話期首程序);

  • 如果會話期首程序終止,則該訊號傳送到該會話期前臺程序組;

  • 一個程序退出導致一個孤兒程序組產生時,如果人一個孤兒程序組程序處於STOP狀態,則傳送SIGHUP和SIGCONT訊號到該程序組中所有程序。

因此當網路斷開或視窗關閉時,控制程序收到SIGHUP訊號退出,會導致該會話期內其他程序退出。

一個簡單例子

開啟兩個SSH終端視窗,在第一個中執行ping命令:

image

再另一個終端視窗中,找到ping的程序ID為22132,其父程序ID為21803,即登入zsh:

image

使用ps -xj可以看到,登入zsh(PID 21803)和ping在同一會話期,zsh為會話期首程序,所以程序組PGID為21803,ping所在的程序組PGID為22132,為前臺程序組。

image

這時,我們關閉第一個SSH遠端視窗,在另一個視窗中看到ping程序被殺掉了:

image

這就發現,當我們執行一個耗時的任務時,如果關閉了這個視窗,這個任務程序也就被殺掉了,並不是我們所期望的那樣在後臺繼續執行。

使用screen

​ 現在,也不需要多說screen到底是幹什麼的了,直接說怎麼使用吧。

  1. 直接執行screen命令

image

screen將建立一個執行shell的全屏視窗,可以看到視窗的title已經提示處於screen程式中,在這個視窗中你可以隨便執行命令,如果要退出輸入exit命令。

  1. 如果你想新開一個視窗執行另一個任務,可以執行:
// 方法1
按鍵盤Ctrl+a +c, 會心開啟一個screen視窗
​
// 方法2
screen 需要執行的任務的命令,比如:
screen ping www.baidu.com</pre>
  1. 多個screen視窗切換
方法1
鍵盤Ctrl+a +[0..9]
​
方法2
鍵盤Ctrl+a +n, 下一個screen視窗
鍵盤Ctrl+a +p, 上一個screen視窗</pre>

更多命令可以看下圖:

image

image

Screen是一個可以在多個程序之間多路複用一個物理終端的視窗管理器,Screen中還有會話的概念,使用者可以在一個screen會話中建立多個screen視窗,而在每一個screen視窗中就像操作一個真實的SSH連線視窗那樣。

參考:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/

歡迎關注我的公眾號: