GNU Screen
GNU Screen 是一個全屏窗口管理器,它在多個進程(通常是交互式 shell)之間復用一個物理終端。Screen 中運行的程序在其窗口當前不可見時仍可繼續運行,甚至在整個屏幕會話從用戶終端分離時也是如此。
有關功能之描述,參閱官方概述 GNU Screen 手冊。
安裝[編輯 | 編輯原始碼]
用法[編輯 | 編輯原始碼]
輸入命令時按下 "轉義鍵 "Ctrl+a
,然後進行鍵綁定。
有些用戶認為默認的轉義鍵 Ctrl+a
不方便。可以按照 #更改轉義鍵中的說明,將轉義鍵更改為其他鍵。
常用命令[編輯 | 編輯原始碼]
Ctrl+a
?
顯示命令及其默認值Ctrl+a
:
進入屏幕命令提示符Ctrl+a
"
窗口列表Ctrl+a
0
打開窗口 0Ctrl+a
A
命名當前窗口Ctrl+a
a
發送到Ctrl+a
當前窗口Ctrl+a
c
創建一個新窗口(帶 shell)Ctrl+a
S
將當前區域水平拆分為兩個區域Ctrl+a
|
將當前區域垂直拆分為兩個區域Ctrl+a
tab
將輸入焦點切換到下一個區域Ctrl+a
Ctrl+a
在當前區域和上一個區域之間切換Ctrl+a
Esc
進入複製模式(使用 Enter 選擇文本範圍)Ctrl+a
]
粘貼文本Ctrl+a
Q
關閉除當前區域之外的所有區域Ctrl+a
X
關閉當前區域Ctrl+a
d
脫離當前 screen 會話,讓其繼續運行。使用screen -r
恢復
命令提示符命令[編輯 | 編輯原始碼]
Ctrl+a
:quit
關閉所有窗口並關閉屏幕會話
Closes all windows and closes screen session
Ctrl+a
:source ~/.screenrc
重載 screenrc 配置文件(也可使用/etc/screenrc
)
命名會話[編輯 | 編輯原始碼]
要創建命名會話,請使用以下命令運行 screen:
$ screen -S session_name
要(重新)命名現有會話,請在屏幕運行時運行以下命令:
Ctrl+a
:sessionname session_name
打印標識屏幕會話的 pid.tty.host 字符串列表:
$ screen -list
要附加到已命名的屏幕會話,請運行此命令:
$ screen -x session_name
或
$ screen -r session_name
自定義屏幕[編輯 | 編輯原始碼]
You can modify the default settings for Screen according to your preference either through a personal .screenrc
file which contains commands to be executed at startup (e.g. ~/.screenrc
) or on the fly in command mode (e.g. Ctrl+a
:vbell off
).
Tips and tricks[編輯 | 編輯原始碼]
Autostart with systemd[編輯 | 編輯原始碼]
This service autostarts screen for the specified user (e.g. systemctl enable screen@florian
). Running this as a system unit is important, because systemd --user instance is not guaranteed to be running and will be killed when the last session for given the user is closed.
/etc/systemd/system/screen@.service
[Unit] Description=screen After=network.target [Service] Type=simple User=%i ExecStart=/usr/bin/screen -DmS autoscreen ExecStop=/usr/bin/screen -S autoscreen -X quit [Install] WantedBy=multi-user.target
Change the escape key[編輯 | 編輯原始碼]
It can be a good idea to change the default escape key, not only because "a" is usually typed with the left pinky, but also because Ctrl+a
is mapped to the common command beginning-of-line
in GNU Readline and Bash-like shells.
The escape key can be changed with the escape
option in ~/.screenrc
, or the -e
option to screen
.
For example, if you find that you rarely type Ctrl+j
in your shell or editor, you could use escape ^Jj
to set the escape key to Ctrl+j
. The second "j" means that a literal Ctrl+j
can be sent to the terminal via the sequence Ctrl+j
j
. For Dvorak keyboard users, Ctrl+t
(escape ^Tt
) might be more convenient.
More exotic options include escape ``
which sets the escape key to `
, or escape ^^^
which sets it to Ctrl+^
.
The escape key is also called the "command character" in Screen documentation.
Start at window 1[編輯 | 編輯原始碼]
By default, the first screen window is 0. If you would rather never have a window 0 and start instead with 1, add the following lines on your configuration:
~/.screenrc
bind c screen 1 bind ^c screen 1 bind 0 select 10 screen 1
Nested Screen Sessions[編輯 | 編輯原始碼]
It is possible to get stuck in a nested screen session. A common scenario: you start an SSH session from within a screen session. Within the SSH session, you start screen. By default, the outer screen session that was launched first responds to Ctrl+a
commands. To send a command to the inner screen session, use Ctrl+a
a
, followed by your command. For example:
Ctrl+a
a
d
Detaches the inner screen session.Ctrl+a
a
K
Kills the inner screen session.
Start Screen on every shell[編輯 | 編輯原始碼]
For Bash and Zsh, add the following snippet to your .bashrc
or .zshrc
before your aliases:
~/.bashrc or ~/.zshrc
if [[ -z "$STY" ]]; then screen -xRR session_name fi
Use 256 colors[編輯 | 編輯原始碼]
By default, Screen uses an 8-color terminal emulator. To enable more colors, you need to be using a terminal that supports them and set the correct term value. This will use terminfo to describe how the ANSI escape codes will be interpreted. An entry in the terminfo database structure must exist, ncurses包 provides many common descriptions stored under /usr/share/terminfo/
.
First try the generic value:
~/.screenrc
term screen-256color
If that does not work, try setting it based on your terminal. When using xterm-based terminal:
~/.screenrc
term xterm-256color
When using rxvt-unicode:
~/.screenrc
term rxvt-unicode-256color
/usr/share/terminfo/r/rxvt-unicode-256color
is provided by rxvt-unicode-terminfo包, which is installed as a dependency of rxvt-unicode包. However, if you log into a server via SSH and run screen there, this terminfo file might not be available on the server. In this case it is recommended to copy /usr/share/terminfo/r/rxvt-unicode-256color
on the server, it can be saved in ~/.terminfo/
.As a last resort, try setting termcapinfo instead:
~/.screenrc
attrcolor b ".I" # allow bold colors - necessary for some reason termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' # tell screen how to set colors. AB = background, AF=foreground defbce on # use current bg color for erased chars
Informative statusbar[編輯 | 編輯原始碼]
The default statusbar may be a little lacking. You may find this one more helpful:
~/.screenrc
hardstatus off hardstatus alwayslastline hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'
Another possibility, taken from frodfrog's blog[失效鏈接 2023-04-23 ⓘ] is:
~/.screenrc
hardstatus alwayslastline '%{= G}[ %{G}%H %{g}][%= %{= w}%?%-Lw%?%{= R}%n*%f %t%?%{= R}(%u)%?%{= w}%+Lw%?%= %{= g}][ %{y}Load: %l %{g}][%{B}%Y-%m-%d %{W}%c:%s %{g}]'
As of Screen v5 (master branch currently) the escape codes have changed, you could use this instead:
~/.screenrc
truecolors on hardstatus off backtick 0 5 5 "/bin/date" '+%Y-%m-%d' backtick 1 5 5 "/bin/date" '+%H:%M' hardstatus alwayslastline '%{#00ff00}[ %H ][%{#ffffff}%= %{7}%?%-Lw%?%{1;0}%{1}(%{15}%n%f%t%?(%u)%?%{1;0}%{1})%{7}%?%+Lw%?%? %=%{#00ff00}][ %{#00a5ff}%{6}%0` %{#ffffff}%{7}%1`%{#00ff00} ]'
statusbar at top:
~/.screenrc
hardstatus firstline
Turn welcome message off[編輯 | 編輯原始碼]
~/.screenrc
startup_message off
Turn your hardstatus line into a dynamic urxvt|xterm|aterm window title[編輯 | 編輯原始碼]
This one is pretty simple; just switch your current hardstatus
line into a caption
line with notification, and edit accordingly:
~/.screenrc
backtick 1 5 5 true termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007' hardstatus string "screen (%n: %t)" caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`" caption always
This will give you something like screen (0 bash)
in the title of your terminal emulator. The caption supplies the date, current time, and colorizes your screen window collection.
Use X scrolling mechanism[編輯 | 編輯原始碼]
The scroll buffer of GNU Screen can be accessed with Ctrl+a
[
. However, this is very inconvenient. To use the scroll bar of e.g. xterm or Konsole, add the following line [1]:
~/.screenrc
termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@
Attach an existing running program to screen[編輯 | 編輯原始碼]
If you started a program outside Screen, but now you would like it to be inside, you can use reptyr to reparent the process from its current TTY to one inside screen.
Get the PID of the process (you can use ps ax
for that). Now just enter the PID as argument to reptyr inside a screen window.
$ reptyr pid
Setting a different bash prompt while in screen[編輯 | 編輯原始碼]
If you want a different bash prompt when in a screen session, add the following to your .bashrc
[2]:
if [ -z $STY ] then PS1="YOUR REGULAR PROMPT" else PS1="YOUR SCREEN PROMPT" fi
Turn off visual bell[編輯 | 編輯原始碼]
With this setting, Screen will not make an ugly screen flash instead of a bell sound.
~/.screenrc
vbell off
Getting rid of the vertical and horizontal bars[編輯 | 編輯原始碼]
To get rid of the vertical bars:
$ ~/.screenrc
rendition so =00
To hide the horizontal bar, set the back and foreground color to default (d) and display a blank (" "):
~/.screenrc
caption string "%{03} "
If this does not work, try caption string "%{00} "
instead. For the default caption in black and white, use caption string "%{00}%3n %t"
.
Troubleshooting[編輯 | 編輯原始碼]
Fix for residual editor text[編輯 | 編輯原始碼]
When you open a text editor like nano in screen and then close it, the text may stay visible in your terminal. To fix this, put the following:
~/.screenrc
altscreen on
Fix for Name column in windowlist only show "bash"[編輯 | 編輯原始碼]
Add following to ~/.screenrc
:
~/.screenrc
windowlist string "%4n %h%=%f"