最後更新: 2018-07-27
目錄
- 前言
- 功能介紹
- 一般設定
- 基本應用
- Hotkey 與 Command
- 一窗多用
- 分割屏幕
- Copy & Paste
- Log 下自己的一舉一動
- 共用 session
- login 後自動執行已有的 session
- lock & logout
- In screen ssh another Linux
- re-attach to my session after a lost connection
- run program(de-attach screen run script)
- Other Info.
- xterm 與 screen
- 其他選擇
前言
閒話不多說, 看圖就知 screen 用來做什麼 !!
(圖1)
功能介紹
- 在一個物理終端上獲得多個虛擬終端的效果 (終端是指 tty, pts 之類的東西)
- 用 SSH 時不怕斷線 (例如當 zip file 時斷線. 由於 zip 不是 daemon 來, 所以線一斷, 它就停)
- logout 後仍可繼續執行 shell 程式, 令它們猶如 daemon (這是可看成特別的斷線情況)
- 在沒有 mouse 的 terminal 上實現 copy & paste
- 實現 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 位元 |