GNU screen 應用手記

最後更新: 2018-07-27

目錄

前言

閒話不多說, 看圖就知 screen 用來做什麼 !!

(圖1)

功能介紹

  1. 在一個物理終端上獲得多個虛擬終端的效果 (終端是指 tty, pts 之類的東西)
  2. 用 SSH 時不怕斷線 (例如當 zip file 時斷線. 由於 zip 不是 daemon 來, 所以線一斷, 它就停)
  3. logout 後仍可繼續執行 shell 程式, 令它們猶如 daemon (這是可看成特別的斷線情況)
  4. 在沒有 mouse 的 terminal 上實現 copy & paste
  5. 實現 scroll 功能 (在看較長的 output 時不用 less 了, 如: ifconfig | less )

由於 screen 功能強大, 所以指令眾多 !!

起手用到時, 會常常忘記指令 ....

那大家可以嘗試在 screen 環境內按入 "ctrl-a ?" 組合鍵又或 "screen -h" 求助

看看能不能找回一點點回憶 =, =""" 呵呵

 


一般設定

 

設定檔:

/etc/screenrc           // 全部用戶的公用設定檔

~/.screenrc             // 個別用戶的設定

最快捷的設定值是可由 default 檔複製來修改

cp /usr/share/doc/screen/examples/screenrc ~/.screenrc

 

實用設定

startup_message off            // 不顯示歡迎畫面

vbell off                      // 免去煩人的閃光 <-- "Ctrl+a, Ctrl+g"

defscrollback 1000             // 可以看回更多以前的輸出畫面

hardstatus alwaysmessage       // screen 輸出的內容放在 state bar, 如 "ctrl+a w"

altscreen on                   // 離開 vi 之類的 program 會清空瑩幕

screen -t veiw  1 bash         // 自啟動 3 個 shell
screen -t cmd   2 bash
screen -t man   3 bash

caption always "%3n %t%? @%u%?%? [%h]%?%=%c"
# 會有下圖這樣一條的 state bar, 它的格式是 id, title, time

caption

Command: caption always|splitonly [string]

Default: splitonly "%3n %t"Screen

Normally a caption is only used if more than one window is shown on the display (split screen mode).

string

  • %    The escape character
  • t    window title
  • n    window number

 


基本應用

 

# 啟動 screen, 只要鍵入

screen

現在我們就在 screen 的虛擬 terminal

它是把自己虛擬成 vt100 的, 所以可能會原來的 function 有些不用

如果大家沒有修改過的話, 原本應該是在 xterm 內的

想知有什麼功能不同?? 請鍵入 infocmp

 

# 暫時離開 screen (術語叫 detach)

ctrl-a d

離開後, 我們會返回原有的 terminal, 如 xterm

不過在 screen 內的程式依然會運行 !! 如 rtorrent

 

# 重返回 screen 裡

screen -x

當只有一個screen時, 就會立即回到之前 detached 的 screen 內

不過當數個 screen session 在執行時, 就耍用

screen -r <session>

指定回到那一個 session 內, 

session 的指定可以用 PID , tty, host, socket 其中一個唯一值指出

它們是存放在 /var/run/screen/用戶名/內的 ~

 

我們可以列出目前的所有 screen 會話

screen -list [user]

                 or

screen -ls

                 or

ctrl-a *

lamp:/var/run# screen -ls
There are screens on:
        4093.pts-0.lamp (Saturday, January 01, 2011 08:46:15 HKT)       (Detached)
        4088.pts-0.lamp (Saturday, January 01, 2011 08:46:10 HKT)       (Detached)
2 Sockets in /var/run/screen/S-root.

命名

最後, 我們可以為 screen 建立一個有意思的名稱, 以便 detach 之後 re-attach

注意, 命名過程是要在它出世時改的 !!

screen -S test

lamp:/var/run# screen -ls

There are screens on:

        4106.test       (Saturday, January 01, 2011 08:52:53 HKT)       (Detached)
        4093.pts-0.lamp (Saturday, January 01, 2011 08:46:15 HKT)       (Detached)
        4088.pts-0.lamp (Saturday, January 01, 2011 08:46:10 HKT)       (Detached)

3 Sockets in /var/run/screen/S-root.

 

Set title

screen -t name            # 相當於 ctrl + a, A

 


Hotkey 與 Command

 

# kill a tab(frozen)

Ctrl+a k

相當於

Ctrl+a :kill

 


一窗多用

 

我們可以在 screen 裡建立多個新 session

這樣好似有幾個 ssh client 在行一樣

ctrl-a c

留意 state bar 的變化, 它會指出當前的 session window

指令前是在: 0 bash, 指令後就會跳到新的: 1 bash

 

在各 session window 之間走來走去方法

跳到下一個 session window:

ctrl-a n

返回前一個 session window:

ctrl-a p
     or
ctrl-a ctrl-a

直接跳到指定的 session window

ctrl-a <num>

 

列出目前所有的 session window 選單

ctrl-a "

 

刪除當前 session window

ctrl-a k
    or
鍵入 exit

 

最後, 我們亦可為 session window 改名,
以免在不正確的 session 上做野 !!

ctrl-a A

 

由於 ctrl+a 被 screen 食了, 如果要 Send ctrl+a 入 program, 那要按

ctrl+a a

 


分割屏幕

 

我們可以把 terminal 分成 n 等份

# 進入屏幕分割模式

ctrl-a S

Notes: 每次會建立一個分割, 按兩次即是三等份

# 跳到另一個屏幕

ctrl-a <TAB>

剛分割屏幕後, 我們只會在 "blank window" ( ctrl-a - )

什麼都做唔到 ... 亦即是說它只是單純的分割來

Status Bar: "--"

# ctrl-a c 與 ctrl-a num

在 "blank window" 用 "ctrl-a c" 建立 session 或是用 "ctrl-a num" 去用調用 session

 

# 離開 splite mode (停留在當前 Window)

ctrl-a Q

# 在多個 window 環境下直接離開 (連 screen 的 session 都殺掉 !!)

ctrl-a : quit

 


Copy & Paste

 

啟動複製功能:

ctrl-a [

我們同時可以此 scroll 回之前的 output

按 <enter> 開始選擇要複製的地方

再一次按 <enter> 存儲所要的內容到 buffer

貼上:

ctrl-a ]

 


Log 下自己的一舉一動

 

在 bash 的 history 只會記錄我們輸入過什麼指令,

但不會記錄輸出的結果 =, ="

screen 就好不同 !!

它連輸出的顏色都會記者下

只要

ctrl-a H

它就會開始 log 下瑩幕輸出到 $HOME/screenlog.<session num>

再按一次 "ctrl-a H" 就會停下不 log 了 @@"

 


共用 session

 

分享 session 出來, 有個好處

那就是可以找人幫你 TroubleShoot 個系統

而又不同幫它擁有 root 的權限, 並且可以監視它的一舉一動

以下假設 user1 分享, user2 連入

user1:

// user1 分享現有的全部 session 出來, 且 user2 可以操作它們

ctrl+a : multiuser on
ctrl+a : acladd user2
screen -S ShareSessionName

user2:

// 連入 user1 分享的 session

screen -x user2/ShareSessionName

取消分享

user1:

# 查看當前有什麼用戶

ctrl+a *

# 取消 user2 的使用權

ctrl+a : acldel user2

Command list:

acladd <user>, acldel <user>, multiuser on, screen -S <name>

 


login 後自動執行 screen

 

當 screen 執行後, 會有個 env. var. STY=pid.pts-n.host

如 STY=1369.pts-0.lamp

我們藉著測試它來回覆 screen

指令如下, 它是寫在 ~/.bashrc 裡的

#### restore screen ####
if [ -z $STY ]; then
    mycheck=`screen -ls | grep "No Sockets"`
    if [ -z "$mycheck" ]; then
        exec screen -x
    fi
fi
########################

 


Lock a session

 

用處: 離開電腦一會

Lock

ctrl-a, x

之後返回要有密碼才可重用 !!!

Screen used by root <root>.
Password:

P.S.

當在沒有設定 password 時, 但錯手 lock 了 screen, 那只要離開 ssh 之後再 ssh attach 返即可.

密碼的建立:

Ctrl+a, :

之後鍵入 password

[ Password moved into copybuffer ]

Ctrla+ a, ] 貼到 .screenrc 內的  password 那一行

i.e.

password ?????????

 


Detach & logout 一 take 過

 

ctrl-a DD

 


In screen ssh another Linux

 

很多時會遇到以下問題:

Unknown terminal: screen.linux

解決:

在 local  ~/.bashrc 加入

if [ "$TERM" = "screen.linux" ]; then
       TERM="screen"
       export TERM
fi

 


re-attach to my session after a lost connection

 

解決方法: detach your session manually

screen -ls

There is a screen on:
        30590.tim       (Saturday, April 22, 2017 07:13:32 HKT) (Attached)
1 Socket in /var/run/screen/S-root.

screen -d tim

[30590.tim detached.]

OR

screen -D tim

[30590.tim power detached.]

-D => If necessary, force logout remotely.

 


run program(de-attach screen run script)

 

ie.

screen -S MyName -t MyTitle -dm /path/to/script

-d -m

Start screen in "detached" mode.

 => forces creating a new screen session and immediately detaches from it

 => This is useful for system startup scripts.

當 "-m" 單一個出現時

-m  

causes screen to ignore the  $STY environment variable. 

With "screen -m" creation of a new session is enforced,

(regardless whether screen is called from within another screen session or not.)

 * This flag has a special meaning in connection with the `-d'

start_send_sms.sh (-rwx------)

#!/bin/bash

_Name=loop_send_sms
_Script="/home/vhosts/sms/scripts/${_Name}.sh"

screen -d -m -t $_Name -S $_Name bash $_Script

loop_send_sms.sh (-rw-------)

...
plock
while true
do
    php -q /home/vhosts/sms/private/send_sms.php &> $_log
    echo "sleep"; sleep 10
done
punlock

 


Other info.

 

直接在 screen 執行 screen 的指令 (不 attach 入去)

# -X            Execute <cmd> as a screen command in the specified session.

cmd

  • quit
  • kill
  • title
  • ...

i.e.

screen -ls                        # 查看 SessionName

screen -S 1234 -X quit     # 在  Session 1234 上執行 quit

Permission (CentOS 7.4)

screen 執行檔的權限是值得注意的, 如下

-rwxr-sr-x. 1 root screen 475168 Feb 17  2016 /usr/bin/screen

所以它的 scoket 一定要是

ls -l -d /var/run/screen/S-root

drwx------ 2 root root 60 Apr 12 17:22 /var/run/screen/S-root

ls -l /var/run/screen/S-root

total 0
srwx------ 1 root root 0 May  8 14:59 23260.tim

Resizing regions with Commands

ctrl-a : resize 24

畫面鎖定與解除

它的功能猶如 Scroll Lock, 會令晝面有 frozen 效果

xoff

ctrl+a s

xon

ctrl+a q
 

在 screen 內看到有什麼人用 sreen, 仍如 screen -ls

ctrl-a *

操作了一段時間, screen 可能會出錯, 我們可以嘗試 reset 它

ctrl-a Z

 


xterm 與 screen

 

行 screen 有機會見到

/var/run/utmp: No such file or directory
Cannot find termcap entry for 'xterm'.

# Find out which TERM is supported:

ls /usr/share/terminfo/x

解決

export TERM=xterm

TERMINFO=/usr/share/terminfo screen

xterm emulates one terminal showing it as a GUI window on screen

screen emulates multiple terminals, but does not actually emulate the output part

it behaves like a program that itself needs a terminal to show on - but only one!

Note that there are some terminal emulators like terminator,

that implement the features of xterm and screen at the same time

 


其他選擇

 

 

 

 

附加檔案大小
screenrc.477 位元

Creative Commons license icon Creative Commons license icon