screen 指令是一般 UNIX/Linux 使用者或管理者常會使用的終端機管理程式,它可以讓一個終端機當成好幾個來使用,對於以 SSH 連線到伺服器上工作的人會很有用。
通常一個終端機(terminal 或 console)只能開啓一個互動式(interactive)的 shell 來使用,而藉著 screen 的幫助,使用者可以在一個終端機下,同時開啓多個互動式的 shell,除了自己使用之外,還可以讓 session 分享給不同的使用者,或是讓執行中的 session 暫時卸離(detach),隨後再重新連接(attach)即可繼續操作。
安裝 screen
某些 Linux 發行版可能本身就已經內建 screen 這個指令了,但如果你所使用的 Linux 系統沒有安裝,通常也都可以透過套件管理程式直接安裝編譯好的版本,因為 screen 是一個很常用的指令之一,通常安裝起來不需要花費太多的力氣。在 Debian 或 Ubuntu Linux 中若要安裝 screen 可以使用 apt-get 來安裝:
sudo apt-get install screen而 Red Hat 系列的 Linux(如 Fedora 等)則可使用 yum:
yum install screen
開始使用 screen
若要使用 screen 這個工具,就直接在終端機執行它:screen這時候會出現一些訊息,按下空白鍵跳過之後,就可以看到一個新的 shell。下面這個動畫是示範進入 screen 環境後,再執行 exit 離開的狀況。
從這個動畫中大家可以發現到,進入 screen 所建立的新 shell 之後,看起來跟原本的畫面一模一樣,但是它其實是一個新開啟的 shell,而在離開 screen 環境之後,就會回到原本的 shell 中。
線上操作說明
在進入 screen 的環境之後,其實就跟一般的 shell 環境一樣,一般命令列中可以做的事情在這裡也都可以做,只不過在這裡還多出了一些 screen 專屬的控制指令可以使用,而這些 screen 控制指令可以使用 Ctrl + ? 來查詢線上的操作說明。在查詢線上控制指令時,可以使用 Enter 或空白鍵來換頁,看完之後就會回到原來 screen 的環境。
將 screen 卸離(Detach)與重新連接(Re-attach)
使用 screen 最大的好處之一就是可以將其卸離,而在重新連接之後完全不會影響正在執行中的任何工作,以下舉個實際的例子來說明這個功能在什麼時候會用到。假設你現在要更新 Linux 伺服器,而更新的過程需要使用 wget 下載數百 MB 甚至幾 GB 的更新檔案,你可能會使用 SSH 連線到伺服器上,然後執行 wget 開始下載,這個時候如果網路比較慢,就會需要等很久,在等待的期間又不能把 SSH 連線關掉(因為這樣下載就會中斷),唯一的辦法就是放著慢慢等,這個問題有時候很頭痛,尤其是在要下班的時候。
像這樣的狀況就可以使用 screen 來解決,這裡我們以 ping 指令來示範如何將執行中的工作卸離,然後再重新連接。一開始先執行
screen進入 screen 的環境,接著執行
ping www.hinet.net這個指令,讓它不斷測試與 Hinet 網頁之間的網路連線品質。
使用 ping 來示範的原因是因為它在執行之後就會不斷的送出 ICMP 封包,直到使用者按下 Ctrl + c 為止,所以它可以一直執行下去不會中斷,方便我們測試 screen 的卸離功能。
接著使用者就可以按下 Ctrl + a 後,再按下 d 鍵(detach),這時候整個 screen 就會被卸離,然後出現類似
[detached from 5326.pts-0.seal-home]這樣的訊息,這個時候就表示這個 screen 已經被卸離了,有點像是放進背景中執行一樣,而這個時候你甚至可以把 SSH 連線中斷也不會影響該工作的執行。
之後若要重新連接上這個 screen,可以執行
screen -r這樣就會回到之前的 screen 環境中,這時候你也可以看到 ping 指令還在執行,並沒有受到影響。下面這個動畫是整個流程的畫面。
當然除了 ping 之外,其餘任何工作都可以使用這樣的方式卸離,包含使用 wget 下載、以 apt-get 安裝套件或其他各種耗時的指令都可以。
同時使用多個 screen 工作環境
如果你感覺只有一個 screen 工作環境不夠用,你也可以將現有的 screen 工作環境卸離後,在原來的 shell 中再執行一次 screen 指令,建立另外一個新的 screen 環境來使用。如果在同一時間有好多個 screen 工作環境都處於卸離狀態,則在重新連接時可以使用
screen -ls來列出目前所有的 screen 工作環境,輸出會類似這樣:
There are screens on:若要連接第一個 20451.pts-4.steteo1 這個 screen 工作環境,則在 -r 參數之後加上這個名稱即可:
20451.pts-4.steteo1 (11/15/2013 10:57:34 AM) (Detached)
20393.pts-4.steteo1 (11/15/2013 10:57:23 AM) (Detached)
2 Sockets in /var/run/screen/S-seal.
screen -r 20451.pts-4.steteo1這樣就可以重新連接上去了,由於這種指令很冗長,使用上不方便,所以 screen 也允許使用者只使用名稱的開頭,只要足夠提供它辨識要指定的 screen 工作環境是哪一個就可以,以這個例子來說,就可以改為:
screen -r 20451這樣使用上會比較方便。而因為另外一個 screen 工作環境是 203 開頭,所以最精簡的狀況可以只輸入 204,也就是這樣:
screen -r 204
使用多個 screen 視窗
若要同時使用多個互動式 shell,最方便的方式是在一個 screen 工作環境中建立多個「視窗」,而每一個視窗都可以提供一個獨立的 shell 給使用者進行互動式的操作,這樣的作法會比使用多個 screen 工作環境方便,尤其是在切換不同的 shell 時不用卸離再重新連接。在 screen 工作環境中若要建立新的視窗,可以按下 Ctrl + a 後,再按下 c 鍵(create),這樣就會建立一個新的視窗,並出現一個獨立的互動式 shell。
若要在不同的視窗之間切換,可以按下 Ctrl + a 後,再按下 n 鍵(next),這樣就會切換至下一個視窗,若要切換至錢一個視窗,則可以按下 Ctrl + a 後,再按下 p 鍵(previous)。
紀錄所有動作
screen 除了提供獨立的工作環境之外,它還可以把使用者所有的動作記錄下來。若要開啟 screen 的紀錄功能,可以按下 Ctrl + a 後,再按下 H 鍵(請注意這裡是大寫的 H,也就是要按著 Shift 鍵再按 h 鍵),這時候在畫面的左下角會出現紀錄檔名稱,例如:
Creating logfile “screenlog.0“就像這樣:
這樣 screen 就會將所有的動作都紀錄再這個檔案中,若要結束紀錄功能,只要再按一次 Ctrl + a 與 H 鍵即可。
除了在 screen 工作環境中動態開啟紀錄功能之外,也可以在一開始執行 screen 指令時就使用 -L 參數直接開啟:
screen -L
由 screen 所產生的紀錄檔因為包含一些跳脫序列(Escape Sequences),所以如果使用一般的文字編輯軟體開啟的時候,會出現一些亂碼,這是因為一般的軟體無法正確解析這些跳脫序列的關係,要查看紀錄檔最方便的作法就是直接使用 cat
指令在終端機中印出來:
cat screenlog.0如果要把跳脫序列直接拿掉,可以使用這個 alias:
alias stresc='sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"' stresc screenlog.0 > screenlog.0.txt這樣轉出來的 screenlog.0.txt 就可以使用一般的文字編輯軟體開啟了。
鎖定 screen 螢幕
如果在使用 screen 管理伺服器時,要暫時離開電腦,也可以使用 screen 的螢幕鎖定功能,當要鎖定螢幕時可按下 Ctrl + a 後,再按下 x 鍵,這樣螢幕就會被鎖住,就像這樣:若要解開鎖定,則輸入自己的 Linux 系統帳號的密碼即可。
設定 screen 工作環境密碼
除了鎖定螢幕之外,screen 也可以設定工作環境的密碼,這個密碼是在卸離後要重新連接時用的。要設定這個密碼可以在 screen 的設定檔 $HOME/.screenrc 中加入:password crypt_password其中 crypt_password 就是經過加密編碼後的密碼,要產生加密編碼的密碼可以使用 mkpasswd 這個指令,例如將 sealmemory 這個密碼進行編碼,則執行:
mkpasswd sealmemory輸出為
iIPFln8hvJZ6c這個就是經過加密編碼後的密碼,取得這個密碼後,就可以把它寫入 $HOME/.screenrc,就像這樣:
password iIPFln9hvJZ6c這樣下次在 screen 工作環境卸離後再重新連接時,它就會要求輸入這個密碼:
如果有在 $HOME/.screenrc 中設定密碼,則在鎖定 screen 螢幕功能時,解鎖的時候就會要求輸入兩次密碼,一次是 Linux 系統的密碼,另外一次是自己設定的密碼。
離開 screen 工作環境
若要離開 screen 工作環境有幾種不同的方式,如果你的工作還沒做完,想要暫時離開,則使用上面介紹的卸離功能(Ctrl + a 與 d),而如果是工作都已經做完了,則可直接以 exit 指令離開 shell,在 screen 工作環境中所有的 shell 都結束後,screen 會自動結束,另外也可以使用 Ctrl + a 與 k(kill),直接關閉整個 screen 工作環境。screen 參數與操作指令速查表
因為 screen 的指令太多了,無法一一介紹,這裡將常用的 screen 操作指令的簡略說明整理出來,方便大家查閱。screen 參數表
screen 參數 | 說明 |
-c file | 使定使用的設定檔(預設為 $HOME/.screenrc) |
-d [pid.tty.host] | 強制將指定的 screen 工作環境卸離 |
-L | 開啟自動紀錄功能 |
-ls 或 -list | 列出目前所有執行中的 screen 工作環境 |
-r [pid.tty.host] | 重新連接執行中的 screen 工作環境 |
-R | 重新連接最近卸離的 screen 工作環境 |
-U | 以 UTF-8 模式執行 |
-wipe [match] | 將廢棄的 screen 工作環境清除 |
screen 操作指令表
screen 參數 | 說明 |
Ctrl + a 與 c | 建立新 screen 視窗 |
Ctrl + a 與 Ctrl + a | 切換至上一個 screen 視窗 |
Ctrl + a 與數字鍵 0 到 9 | 切換至指定編號的 screen 視窗 |
Ctrl + a 與 n | 切換至下一個的 screen 視窗 |
Ctrl + a 與 p | 切換至下一個的 screen 視窗 |
Ctrl + a 與 w | 列出目前所有的 screen 視窗 |
Ctrl + a 與 " | 列出目前所有的 screen 視窗,並可用上下鍵選擇要切換的設窗 |
Ctrl + a 與 k | 關閉目前的 screen 視窗 |
Ctrl + a 與 d | 卸離 screen 工作環境 |
Ctrl + a 與 Esc 鍵(或 Ctrl + a 與 [) | 進入複製模式(copy mode),可用方向鍵操作捲軸,或用 / 與 ? 來搜尋,按下空白鍵開始選取要複製的內容,選取完成後再按下第二次空白鍵,即可複製,隨後使用 Ctrl + ] 可貼上複製的內容。 |
Ctrl + a 與 S | 將畫面分割成上下兩個區域 |
Ctrl + a 與 Q | 關閉分割畫面 |
Ctrl + a 與 Tab 鍵 | 切換分割畫面 |
Ctrl + a 與 t | 顯示目前系統的時間與負載狀況 |
Ctrl + a 與 a | 送出 Ctrl + a |
Ctrl + a 與 ? | 顯示說明 |
Ctrl + a 與 v | 顯示版本資訊 |
Ctrl + a 與 x | 鎖定 screen 螢幕 |
Ctrl + a 與 H | 開啟或結束 screen 紀錄功能 |
Ctrl + a 與 C | 清除 screen 視窗中的內容 |
Ctrl + a、D 與 D | 強力卸離,卸離 screen 工作環境之後,直接登出 |
Ctrl + a 與 Ctrl + g | 視覺化鈴聲(visual bell)切換 |
Ctrl + a 與 i | 顯示目前 screen 視窗的資訊 |
Ctrl + a 與 l | 重繪目前 screen 視窗的內容 |
參考資料:Tecmint、GNU Screen
沒有留言:
張貼留言