這裡介紹如何使用 screen
指令來操控 UNIX/Linux 的終端機,讓工作更有效率。
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 (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.
若要連接第一個 20451.pts-4.steteo1
這個 screen
工作環境,則在 -r
參數之後加上這個名稱即可:
screen -r 20451.pts-4.steteo1
這樣就可以重新連接上去了,由於這種指令很冗長,使用上不方便,所以 screen
也允許使用者只使用名稱的開頭,只要足夠提供它辨識要指定的 screen
工作環境是哪一個就可以,以這個例子來說,就可以改為:
screen -r 20451
這樣使用上會比較方便。而因為另外一個 screen
工作環境是 203
開頭,所以最精簡的狀況可以只輸入 204
,也就是這樣:
screen -r 204
Page: 1 2