screen 簡介
*這是篇兩三年前的舊文章* 原文刊在於 linuxfab,因為有的人看不到,所以在這裡重貼
一次,順便會做點修正,麻煩大家批訐指教^^
screen 這個軟體是不少玩家必備工具,它的功能可以滿足喜歡遠端控制機器的人,還有
喜歡一次開很多視窗的人,如果常覺得使用的網路不是很穩定,那 screen 更可以讓你避
免常常要重新登入的痛苦, 這裡我寫了一個簡單的介紹希望可以讓更多的人了解 screen
的基本的用法及好處...
什麼是 screen
嗯,從小歷史就不好,這裡不談 screen 的歷史, screen 是幹嘛的?依照它的線上手冊
(manual pages),它是個全螢幕的視窗管理員(full-screen window manager),不過
別緊張,它跟 X-Window 上面的 GNome,AfterStep 等等視窗管理員一點關係也沒有。
簡單地說,它是個文字界面的 VT100/ANSI 終端模擬器(terminal emulation),如果你
玩網路已有一段時間了,那你一定曾經在某 BBS 站註冊時,會發現它要你輸入你的終端
機型別,通常預設就是 VT100 了,所以只要按了 enter 鍵就可以了,而什麼是
terminal ,可以想成是定義你鍵盤上某個鍵按下去之後在螢幕上會顯示出來什麼符號或
是字元,以及螢幕上的一行可以容納多少個字元等等,詳細的資料請參考 termcap ,
FreeBSD 使用者請看 /usr/share/misc/termcap,Linux 使用者(RedHat)請看
/etc/termcap 。至於 Window 的使用者,對不起,找個工作站連上去吧。
好,那麼 screen 到底可以做些什麼呢?
當我們執行 screen 時,會進入 screen 的空間裡,你會發現沒什麼變化,只是好像重新
執行了一次 shell ,沒錯,如果你只做一件事,其他都不管,那 screen 對你來說沒什
麼做用,但是如果你打算登入到很多 bbs 站(好比來個五個 bbs 站吧),可是又怕在這
麼多視窗中切換會不小心跟錯誤的人傳了錯誤的訊息,或是怕視窗開了太多,有人傳給你
重要的訊息而你看不到而忽略了,那你就需要它了。
當然,我的意思不是說 screen 是上 bbs 站的利器(當然也是:p),而是可以讓你只要
靠一個視窗就可以同步地處理很多的事情,你可以在瀏覽某大 bbs 站文章時,同時正有
一個 process 在編譯明天要交的功課,而另一個 process 正在幫你傳送(ftp)某個大
檔案。而你可以不需要再移動你的手放到滑鼠上面去切換視窗,只需要按三個鍵就可以切
換到你希望看到的視窗。
中文字是很麻煩的,剛剛說的視窗,實際上是不同的東西,在 X-Window 下或是
Window98/NT/2000 下的視窗就是開出來一個個外面有框框的東西,右上角還會有三個小
框框讓你縮放或關掉這個視窗。而經由 screen 所開出來的視窗則只是在原來的視窗裡再
生出一個視窗,你一次只能看到一個視窗畫面,但是同時所有的視窗(最多一個 screen
session 可以開十個視窗)仍然在運作(好比在背景執行的 process)。
安裝 screen
FreeBSD
因為有了 ports ,一切事物經由 FreeBSD 看起來是那麼美好,你只要到
/usr/ports/misc/screen 目錄下,打 make; make install 就好了:
% cd /usr/ports/misc/screen % make % make install
至於沒有 ports 的 FreeBSD 愛好者,請到
ftp://freebsd.csie.nctu.edu.tw/pub/distfiles 去抓原始碼回來編譯吧。
Linux
Linux 因為版本眾多,這裡以 RedHat 6.1 為主,在
ftp://linux.sinica.edu.tw/pub1/redhat/redhat-6.1/SRPMS/SRPMS/
裡有 screen 的原始碼可以抓取:
% rpm --rebuild screen-3.9.4-2.src.rpm
其他的使用者也可以到 ftp://linux.sinica.edu.tw/ 去尋找。
當然也可以使用 RedHat 的 rpm 來直接把執行檔安裝好,就不必再自行編譯了:
ftp://linux.sinica.edu.tw/pub1/redhat/redhat-6.1/i386/RedHat/RPMS/
% rpm -ivh screen-3.9.4-2.i386.rpm
使用 screen
在命令列下打 screen 就會進入 screen 的天地:
% screen
注意,所有 screen 的指令都是以 Ctrl 鍵加上 a 鍵開始的,在之後以 C-a 代表,C-a
c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開按 c 鍵;而 C-a C-c 代表按住 Ctrl 鍵
不放再按 a 鍵,然後放開後再按住 Ctrl 鍵不放按 c 鍵。
開啟,關閉,切換
C-a c 或 C-a C-c 開啟新的視窗,並同時切換到這個新的視窗
C-a n 或 C-a C-n 或 C-a (space) 切換到下一個視窗(0->1 1->2 ...)
C-a p 或 C-a C-p 切換到上一個視窗(1->0 2->1 ...)
C-a C-a 切換到上一個顯示過的視窗(不是照順序切換)
C-a 0 切換到第 0 個視窗
C-a (1..9) 切換到第 (1..9) 個視窗
C-a w 或 C-a C-w 會列出目前所開啟的視窗
0$ tcsh 1$ tcsh 2*$ tcsh 3$ tcsh
有星號 ""*"" 的表示目前顯示中的視窗,之後的 tcsh 代表這個視窗的 title ,預設是以
開啟時的 shell 名稱
C-a K 關閉所有的視窗並退出 screen
C-a ' 或 C-a "" 會出現 ""Switch to window:"" 字樣,輸入號碼後就可切到該視窗
單一視窗使用中的指令
C-a C 清除目前的視窗內容
C-a d 或 C-a C-d 脫離(detach)目前的 screen ,並放到背景執行(不管開了幾個視
窗),下面會再提到
C-a D D 強力脫離,除了放到背景執行外,並自動 logout
C-a C-g 虛擬嗶聲(visual bell)的切換,可以在畫面上顯示訊息代表一般的嗶聲
C-a H 紀錄目前視窗所有顯示過的東西(檔名為 screenlog.n n 為視窗號碼)
C-a i 或 C-a C-i 顯示目前視窗的資訊
(11,24)/(80,24)+1000 +(+)flow -ins -org +wrap +app -log -mon +r G0 [BBBB]
C-a l 或 C-a C-l 重繪視窗,如果有字顯示亂掉了可以用這個指令
C-a m 或 C-a C-m 或 C-a (enter) 可以顯示最近一次顯示過的訊息
C-a t 或 C-a C-t 顯示系統的時間及主機名稱還有負載
C-a v 顯示版本資訊
C-a x 或 C-a C-x 如果你要暫時離開目前位置又不想先 logout ,那可以用這個來鎖住
screen
C-a ? 線上求助畫面
複製/卷軸 模式
按下 C-a [ 就可以進入 複製/卷軸 模式(只有在目前視窗才算,其他視窗照常)基本上
跟 vi 很像:
h, j, k, l 分別為向左,向下,向上,向右移動一格(或是一行)
0 移到該行最左邊
^ 與 $ 分別移到該行最左邊及最右邊的非空白字元
w 以字為單位往前移動並移到字首
b 以字為單位往後移動並移到字首
e 以字為單位往前移動並移到字尾
C-b 向上捲一頁
C-f 向下捲一頁
C-u 向上捲半頁
C-u 向下捲半頁
/ 與 ? 向下或向上尋找字串
(space) 第一次按下到第二次按下的區域會被複製到暫存區內
(ESC) 離開 複製/卷軸 模式
接著按下 C-a ] 便可以把剛剛存到暫存區內的內容複製出來。
善用 screen
前面提到當按了 C-a d 脫離了 screen 後,會回到沒有執行 screen 時的狀態,但是同
時在之前 screen 裡每個視窗內在跑的 process (不管是前景或背景執行的)仍然繼續
執行,即使 logout 也不會有影響。所以你可能接著離開身邊的電腦,然後跑出去喝個水
,或者另外找個舒服的地方坐下來再接著剛剛的工作。
好,當你重新登入(login)之後,要怎麼接回剛剛的 screen 呢?重打 screen 只會讓
電腦另外又開個 screen 給你,你所要做的事就是加些參數:
screen -ls 顯示目前個人所有的 screen
% screen -ls
There are screens on:
1188.ttyp4.SungSung (Attached)
76920.ttypq.SungSung (Detached)
2 Sockets in /tmp/screens/S-AlanSung.
上面的 Attached 表示你現在連接的 screen ,而 Detached 則表示沒有連接的,最後則
是共有多少個 screen 數量
screen -r 就是重新回到(resume)screen 裡,如果你只有開一個 screen ,那只要簡
單地打
% screen -r
就沒問題了,但是像上面那個,如果你有了兩個以上的 screen ,這樣就有問題了
% screen -r
There are several screens on:
1188.ttyp4.SungSung (Detached)
76920.ttypq.SungSung (Detached)
Type ""screen [-d] -r [pid.]tty.host"" to resume one of them.
如它的訊息所述,你可以加上它的 process id 或是使用的 tty 加上主機名來決定要接
回那一個 screen 。假設在這裡我們要接回 process id 為 1188 的那一個,就打
% screen -r 1188
或
% screen -r ttyp4
或
% screen -r ttyp4.SungSung
或
% screen -r 1188.ttyp4.SungSung
都可以
screen -d 假設現在自己的電腦突然當機,或是網路突然斷了一時連不上去,等到好了之
後,想要接回來原來的 screen 卻發現
% screen -r
There is a screen on:
1188.ttyp4.SungSung (Attached)
There is no screen to be resumed.
這時候 -d 這個參數就派上用場了,讓你可以控制某個 screen 脫離(detach),接著再
加上 -r 把這個 screen 接手回來
% screen -d
[1188.ttyp4.SungSung detached.]
% screen -r
或直接
% screen -d -r
screen -wipe 有時候不小心跳電了,這時候重開機後當然也不會有 screen 留著,但是
由於 screen 會有紀錄所有的 screen ,因為雖然舊的沒有了,可是還是有紀錄在,因此
這個指令就是把廢棄不用的 screen 給""擦拭乾淨""(wipe)
There are screens on:
69103.ttyp5.SungSung (Removed)
529.ttyp0.SungSung (Detached)
1 socket wiped out.
1 Socket in /tmp/screens/S-AlanSung.
會用了上面所介紹的功能,你可以現在進入 bbs ,進入聊天室跟人聊天或是在上面發表
文章到一半,發現計中要關門了,你可以從容的 detach ,回家之後再連回來 attach ,
繼續剛剛的話題或發表文章,而對方可能根本沒發覺。只要你連線的主機不當機,那電話
線或網路再怎麼不S都不必怕斷線。
如果你需要更多詳細的資料,可以善用線上手冊(manual pages)或是 info 這個指令
% man screen
% info screen
Enjoy it!!
Reference:
http://blog.dragon2.net/archives/2004/10/06/17.php
沒有留言:
張貼留言