天天看點

使用 Screen 建立并管理多個 shell

轉自http://www.ibm.com/developerworks/cn/aix/library/au-gnu_screen/

哈利波特有魔杖,雷神托爾有金色的巨錘,Buckethead 有斧子,但是這些武器與 QWERTY 鍵盤相比隻是小兒科。隻需在指令行上敲幾下,就可以啟動網站、招募軍團或擊敗可怕的火龍。

但是,QWERTY 鍵盤有一個嚴重的缺點:它很容易發生連接配接中斷。電話線上的噪音、無線連接配接中斷或者網絡逾時都可能導緻遠端 shell 中斷。如果您已經在某個工作(比如調試一個應用程式)上花費了好幾小時,而一下子就丢失了所有成果,一定會很沮喪的。

不過這種災難是可以避免的。使用 GNU Screen 就可以了。Screen 可以在一個控制台(即與主機實體連接配接的啞終端)、<code>xterm</code> 視窗或 Secure Shell (SSH) 登入 shell 中建立和管理多個 shell 視窗。可以從一個 shell 視窗迅速切換到另一個視窗,可以離開正在運作的 shell 并在任何時候重新連接配接。實際上,Screen 提供許多虛拟化的控制台。

Screen 本身并不 “露面”;它是一個代理,其作用是在它管理的正在運作的可用視窗中做出選擇。在任何時候,Screen 隻能顯示一個視窗的輸出。可以把 Screen 看作虛拟的鍵盤-視訊-滑鼠 (KVM) 開關。

如果您常常要通路遠端伺服器以執行維護或開發軟體,那麼 GNU Screen 是必不可少的工具。

Screen 的最初版本早在 10 多年前就釋出了,是以您的系統上很可能有這個實用程式(通常名為 /usr/bin/screen)。但是,如果系統上沒有 Screen,也很容易通過發行版的包管理器安裝它。例如,如果您使用 Debian Linux 的變體(比如 Ubuntu),那麼可以用 <code>apt-get</code> 簡便地安裝 Screen:

Screen 現在就安裝好了,可以使用了。輸入 man screen 檢視 Screen 的手冊頁。

<a href="http://www.ibm.com/developerworks/cn/aix/library/au-gnu_screen/#ibm-pcon" target="_blank">回頁首</a>

啟動 Screen。在出現許可協定消息時,按 Return;現在應該會看到一個新的登入 shell 提示。(在下面的清單中,在每個 shell 提示前面人為地添加一個昵稱,以此區分各個 shell 執行個體并與圖 1 到圖 5 聯系起來) 。

按 Ctrl-a,然後在目前視窗中按雙引号鍵("),就可以看到會話中可用視窗的清單:

在預設情況下,視窗的名稱取自它啟動的第一個指令(通常是一個 shell)。是以,在上面的清單中有三個 bash 視窗。可以用箭頭鍵在視窗清單中上下移動;隻需按回車即可選擇視窗。

終止目前視窗的方法是,在視窗的 shell 提示上輸入 <code>exit</code>,或者按鍵盤快捷鍵 Ctrl-a,然後按 k(小寫的字母 K,代表 “kill”)。如果使用後一種方法,那麼在視窗底部會出現一個警告,要求您确認要殺死此視窗。按 y(小寫的字母 Y,代表 “yes”)确認,或按 n(小寫的字母 N,代表 “no”)拒絕。如果殺死一個 Screen 會話中運作的所有視窗,螢幕指令就會輸出一個消息并終止:

如果殺死了所有打開的視窗,那麼 <code>screen -list</code> 指令輸出 <code>No sockets...</code>,表示沒有 Screen 會話可用。

到目前為止,已經看到了如何在一個 Screen 會話中建立多個視窗。隻需這麼做,就足以確定指令行工作不會丢失。

但是坦率地說,由于同時運作多個看起來相同的視窗,管理時可能引起混亂。最好能夠輕松地區分視窗,而不需要逐一打開每個視窗。如果在斷開連接配接和重新連接配接之間間隔的時間比較長的話,這種特性尤其有意義。

實際上,Screen 提供了許多選項和工具來幫助定制您的工作環境。可以給每個視窗指定名稱,還可以在每個視窗的底部顯示一個狀态欄以幫助區分視窗。

指定視窗名稱的方法是,激活視窗,按 Ctrl-a A(大寫的字母 A,代表 “Annotate”),根據需要按 Backspace 删除現有的名稱,然後在提示上輸入一個有意義的名稱:

可以使用狀态欄在視覺上進一步區分各個視窗。啟動您喜歡的文本編輯器,在主目錄中建立包含以下代碼的 .screenrc檔案:

Screen 的特性非常多,無法在這裡一一介紹。下面給出一些提示并介紹幾個比較有用的選項,幫助您更順暢地使用 Screen:

在任何視窗中輸入 <code>screen</code>,不帶任何參數,就會打開一個新視窗。按 Ctrl-a,然後按 c 與輸入 <code>screen</code> 的作用相同,差異隻是後一種方式通過提供指令行選項立即配置新會話。

可以使用 <code>screen -t name</code> 指令在建立視窗時指定視窗名稱。例如,要想建立一個新視窗并把它命名為 debugger,隻需進入 Screen 管理的一個視窗,然後輸入 <code>screen -t debugger</code>。如果打開視窗清單,其中一個視窗的标簽應該是 debugger。

如果已經斷開了與 Screen 會話的連接配接,可以用 <code>screen -p ID</code> 指令重新連接配接特定的視窗,其中的 ID 是一個數字或名稱。我們來試一下:

可以用 <code>screen -L</code> 指令把每個視窗的輸出記錄在日志中。每個視窗有自己的日志檔案,檔案名通常是 ~/screenlog.n,其中的 n 是視窗清單中顯示的視窗編号。這個特性對于記錄複雜的步驟(比如重新配置系統)非常有幫助。

在 Screen 文檔中記錄了所有快捷鍵。最有用的組合鍵包括:按 Ctrl-a,然後按 0(數字零)到 9 立即切換到特定的視窗;按 Ctrl-a,然後按 C(大寫的字母 C,代表 “Clear”)清除一個視窗的内容;按 Ctrl-a,然後按 H 啟用或禁用日志記錄;按 Ctrl-a,然後按 Ctrl-a 在目前視窗和前一個視窗之間來回切換;按 Ctrl-a,然後按 Ctrl-\(反斜杠)殺死所有視窗并終止目前的 Screen 會話。

正如前面提到的,可以建立多個同時運作的 Screen 會話,每個會話可以管理一系列視窗。每個會話有一個惟一辨別符;使用 <code>screen -list</code> 列出可用的所有會話。與視窗一樣,可以給會話指定名稱以便引用它。使用 <code>screen -S label</code> 給新會話配置設定标簽。

共享是 Screen 會話的最佳用法之一。如果允許,可以連接配接現有的會話并在此會話的任何視窗中與其他使用者協作。甚至可以獨立地切換到會話中的另一個視窗。如果您與其他使用者在同一視窗中,輸入或顯示的任何内容都會反映給所有夥伴。我們來試一下:

選擇一台工作計算機并登入。

輸入 <code>screen -S sharing -t one</code> 建立一個名為 sharing 的 Screen 會話和一個名為 one 的新視窗。

用 <code>screen -t two</code> 建立另一個視窗。

如果願意,檢查一下目前的狀态:按 Ctrl-a,然後按 d,然後輸入 <code>screen -list</code> 和 <code>screen -r sharing</code>,然後按 Ctrl-a,然後按 "。

在 one 視窗中輸入 <code>echo</code>,在此視窗中産生一些輸出。

在同一台計算機上,打開第二個登入視窗。

在此視窗中,輸入 <code>screen -x -r sharing -p one</code>。    

在每個登入視窗中,運作 UNIX 指令産生輸出,按 Screen 快捷鍵在共享的會話中的視窗之間切換并檢視結果。

要想進一步掌握 Screen,可以研究一下多螢幕模式,學習如何用老式的鎖防止對各個視窗的通路。

Screen 是一個很實用的工具,它對于在指令行上執行的任何工作都很有價值。實際上,一旦掌握了它,您就會覺得離不開它了。

本文轉自 wdy198622 51CTO部落格,原文連結:http://blog.51cto.com/weimouren/1716377