在本地開發時,經常需要使用遠程連接到Linux伺服器,一開始我自己都是有幾個遠程就開幾個SSH視窗,這種方法很原始很直接,但每次都受夠了密碼輸入,即使用了SSH免密碼登錄,也會覺得每次輸入SSH的命令一點都不快速,況且況且視窗開多了,也會很混亂,不易管理,這種情況,Linux上的工具也有很多,今 ...
在本地開發時,經常需要使用遠程連接到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
命令:
再另一個終端視窗中,找到ping
的進程ID為22132,其父進程ID為21803,即登錄zsh:
使用ps -xj
可以看到,登錄zsh(PID 21803)和ping在同一會話期,zsh為會話期首進程,所以進程組PGID為21803,ping所在的進程組PGID為22132,為前臺進程組。
這時,我們關閉第一個SSH遠程視窗,在另一個視窗中看到ping進程被殺掉了:
這就發現,當我們執行一個耗時的任務時,如果關閉了這個視窗,這個任務進程也就被殺掉了,並不是我們所期望的那樣在後臺繼續執行。
使用screen
現在,也不需要多說screen
到底是乾什麼的了,直接說怎麼使用吧。
- 直接執行
screen
命令
screen
將創建一個執行shell的全屏視窗,可以看到視窗的title已經提示處於screen
程式中,在這個視窗中你可以隨便執行命令,如果要退出輸入exit
命令。
- 如果你想新開一個視窗執行另一個任務,可以執行:
// 方法1
按鍵盤Ctrl+a +c, 會心打開一個screen視窗
// 方法2
screen 需要執行的任務的命令,比如:
screen ping www.baidu.com</pre>
- 多個
screen
視窗切換
方法1
鍵盤Ctrl+a +[0..9]
方法2
鍵盤Ctrl+a +n, 下一個screen視窗
鍵盤Ctrl+a +p, 上一個screen視窗</pre>
更多命令可以看下圖:
Screen是一個可以在多個進程之間多路復用一個物理終端的視窗管理器,Screen中還有會話的概念,用戶可以在一個screen會話中創建多個screen視窗,而在每一個screen視窗中就像操作一個真實的SSH連接視窗那樣。
參考:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/
歡迎關註我的公眾號: