2014年2月19日 星期三

[Coding] Linux Screen指令操作方式

不知道大家是否常常有需要開多個terminal連到server做不同事情的需要,又或者常常需要在背景執行會花很久時間才會結束的操作,又怕不小心和server間斷線,就得在重新開始了。
如果有的話,那麼screen指令,就是你最需要的武器!

簡單介紹一下screen。顧名思義,screen就是會幫你可以開啟多個視窗,並且可以在視窗間切換;即使切換到不同的視窗,原有視窗的工作也會繼續執行下去。例如:可以開一個視窗寫code、開一個視窗編譯、開一個視窗跑IRC跟同事討論。

那麼如何使用呢?
首先,輸入screen以後就會進入screen的世界
ryan@ubt176:~$ screen

注意,所有 screen 的指令都是以 Ctrl 鍵加上 a 鍵開始的,之後會以 Ctrl+a 代表,Ctrl+a c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開按 c 鍵;而 Ctrl+a Ctrl+c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開後再按住 Ctrl 鍵不放按 c 鍵。

視窗操作指令:

Ctrl+a c 或 Ctrl+a Ctrl+c 開啟新的視窗,並同時切換到這個新的視窗 (預設一進入screen後,就已經有一個視窗了,當要進行其他的工作時,才需要再開新的視窗)

Ctrl+a n 或 Ctrl+a Ctrl+n 或 Ctrl+a (space) 切換到下一個視窗(0->1 1->2 ...)

Ctrl+a p 或 Ctrl+a Ctrl+p 切換到上一個視窗(1->0 2->1 ...)

Ctrl+a Ctrl+a 切換到上一個顯示過的視窗

Ctrl+a (0...9) 切換到第 (0...9) 個視窗

Ctrl+a w 或 Ctrl+a Ctrl+w 會列出目前所開啟的視窗

0-$ bash  1*$ bash

有星號 "*" 的表示目前顯示中的視窗,之後的 tcsh 代表這個視窗的 title ,預設是以開啟時的 shell 名稱

Ctrl+a K 關閉目前的視窗

Ctrl+a ' 或 Ctrl+a " 會出現 "Switch to window:" 字樣,輸入號碼後就可切到該視窗

一般操作指令:

Ctrl+a C 清除目前的視窗內容

Ctrl+a d 或 Ctrl+a Ctrl+d 離開目前 screen 的世界,並放到背景執行

Ctrl+a D D 強力脫離,除了放到背景執行外,並自動 logout

Ctrl+a H 紀錄目前視窗所有顯示過的東西(檔名為 screenlog.n n 為視窗號碼)

Ctrl+a t 或 Ctrl+a Ctrl+t 顯示系統的時間及主機名稱還有負載

Ctrl+a v 顯示版本資訊

Ctrl+a x 或 Ctrl+a Ctrl+x 如果你要暫時離開目前位置又不想先 logout ,那可以用這個來鎖住 screen

Ctrl+a ? 線上求助畫面

複製/捲軸模式:

以往沒有進入screen之間,可以直接透過滑鼠 or terminal scrollbar就可以看到之前的訊息。不過,進入Screen以後,就沒有這個方法了。取而代之的是,得進入Copy mode,才能夠看到之前的訊息,甚至是Copy之前的訊息。

只要利用Ctrl+a [ 就可以進入複製/捲軸模式(Copy mode),以下則是相關的操作命令:

Ctrl+a [ 進入Copy mode

h / j / k / l 游標往左/下/上/右移動一格(行)
Ctrl+u / Ctrl+d 往上/下捲半頁
Ctrl+b / Ctrl+f 往上/下捲整頁

0 游標移動到該行最左邊
^ / $ 游標移動到該行最左/右邊非空白字元

w 以字為單位往前移動,並移到字首
b 以字為單位往後移動,並移到字首
e 以字為單位往後移動,並移到字尾

/ 向上搜尋字串
? 向下搜尋字串

Space 第一次輸入和第二次輸入之間的範圍會被複製到暫存區
Esc 離開Copy mode

Ctrl+a ] 將暫存區的內容複製出來

注意的是,Copy mode的Buffer是有限制大小的;如果嫌原本screen的scroll buffer不夠大,無法顯示足夠的資訊的話,那就可以透過Ctrl+a : scrollback <num> 將buffer size設定為<num>一樣大小。

例如:
:scrollback 1024

就可以將buffer設定為1024行。
也可以利用Ctrl+a i,就可以知道目前設定的buffer大小。
(50,1)/(80,24)+1024 +flow UTF-8 1(bash)

如何利用Screen:

前面提到當按了 Ctrl+a d 離開了 screen 的世界後,會回到沒有執行 screen 時的狀態,但此同時,之前 screen 裡每個視窗內在跑的 process (不管是前景或背景執行的)仍然繼續執行,即使 logout 也不會有影響。這讓你可以離開電腦,去休息、或者另外找個地方再接著剛剛的工作。

不過,當你重新登入(login)之後,要怎麼接續剛剛的 screen 呢?重打 screen 只會讓電腦另外又開個 screen ,所以你所要做的就是加些參數:

screen -ls 顯示目前個人所有的 screen
ryan@ubt176:~$ screen -ls
There is a screen on:
        31560.pts-4.ubt176      (02/19/2014 10:54:54 AM)        (Detached)
1 Socket in /var/run/screen/S-ryan.

透過screen -r 可以重返之前screen的世界,不過如果當有兩個以上的screen就不可以這樣打了
ryan@ubt176:~$ screen -ls
There are screens on:
        31624.pts-4.ubt176      (02/19/2014 11:01:22 AM)        (Detached)
        31560.pts-4.ubt176      (02/19/2014 10:54:54 AM)        (Detached)
2 Sockets in /var/run/screen/S-ryan.

ryan@ubt176:~$ screen -r
There are several suitable screens on:
        31624.pts-4.ubt176      (02/19/2014 11:01:21 AM)        (Detached)
        31560.pts-4.ubt176      (02/19/2014 10:54:53 AM)        (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
如它的訊息所說,可以加上screen的 process id 或是使用的 tty 加上主機名來決定要接回那一個 screen 。假設在這裡我們要接回 process id 為 31624 的那一個,就打
ryan@ubt176:~$ screen -r 31624

ryan@ubt176:~$ screen -r 31624.pts-4.ubt176
都可以

假設遇到自己的電腦當機或者是斷線,等到恢復想要resume screen的時候會發現
ryan@ubt176:~$ screen -r
There is no screen to be resumed.

這時候就可以利用 -d 這個參數控制讓某個 screen 先離開screen的世界(detach),然後再接著用 -r 把這個 screen 接手回來
ryan@ubt176:~$ screen -d
[31624.pts-4.ubt176 detached.]

ryan@ubt176:~$ screen -r
或直接
ryan@ubt176:~$ screen -d -r

以上就是大致上常用到的指令啦,如果你需要更多詳細的資料,可以善用線上手冊(manual pages)或是 info 這個指令,就可以得到更多的資訊囉。

張貼留言