Screen

Introduction

screen 是可以只登入一個 terminal,然後開多個 virtual terminal 的程式。

Installation

對於 debian/ubuntu,你可以這樣安裝:

% sudo apt-get install screen

對於 FreeBSD,你可以這樣安裝:

% cd /usr/ports/sysutils/screen ; make install clean

或者從官方網站抓 .tar.gz 回來自己編:

% fetch ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-4.0.2.tar.gz
% tar xvzf screen-4.0.2.tar.gz
% cd screen-4.0.2
% ./configure
% make
% sudo make install

安裝完 screen,可以打 screen 這個指令執行程式:

% screen

Command

節錄自 http://tavi.debian.org.tw/index.php?page=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 會列出目前所開啟的視窗
  • 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 顯示目前視窗的資訊
  • 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 ? 線上求助畫面

善用 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.SungSun (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)

會用了上面所介紹的功能,你可以現在進入 bbs ,進入聊天室跟人聊天或是在上面發表文章到一半,發現計中要關門了,你可以從容的 detach ,回家之後再連回來 attach ,繼續剛剛的話題或發表文章,而對方可能根本沒發覺。只要你連線的主機不當機,那電話線或網路再怎麼不穏都不必怕斷線。

Screenrc

Screenrc 是設定檔,通常它會在 /usr/local/etc/ 或者 ~/.screenrc 底下。screenrc 完整的 option 可以從 manpage 得到:

% man screen

通常我會將 screenrc 改成這樣,注意,這只是我的習慣:

  • 將 “startup_message on” 改成 “startup_message off”,較快進入 screen
  • 將 “vbell on” 改成 “vbell off”
  • 加上下列這三行:
  bindkey "^[[C" next
  bindkey "^[[D" prev
  hardstatus alwayslastline "%m/%d %c %{-b gk}%-w%{+b kg}%50>%n %t%{-b gk}%+w%<"

bindkey 是加入捷徑鍵,上面的 "^[[C" 是 ctrl+右,"^[[D" 是 ctrl+左,用這個來切換分頁會比較快速。不過 ctrl+左或右所對應的 string 不一定是這幾個,會跟著 terminal type 而改變。下面幾個指令是測試你應該 bind 什麼 string:

% cat > /dev/null
% (press ctrl+right or ctrl+left)

然後即可看到真正需要 bind 的 string. hardstatus option 是可以在視窗最下面加上一行 screen 的狀態,當然你可以調整成自己喜歡的風格,詳細請見 manpage。

Reference

documents/misc/screen.txt · 上一次變更: 2008/02/18 13:05 由 gill
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0