GNU Screen
GNU Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间多路复用物理终端。在 Screen 中运行的程序即使在其窗口当前不可见时,甚至在整个 screen 会话与用户终端分离时,也会继续运行。
有关功能描述,请参阅官方概述 GNU Screen 手册。
安装
用法
命令通过按下“转义键” Ctrl+a
然后是按键绑定来输入。
一些用户发现默认转义键 Ctrl+a
不方便。转义键可以更改为另一个键,如 #更改转义键 中所述。
常用命令
Ctrl+a
?
显示命令及其默认值Ctrl+a
:
进入 screen 的命令提示符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
关闭所有窗口并关闭 screen 会话Ctrl+a
:source ~/.screenrc
重新加载 screenrc 配置文件(也可以使用/etc/screenrc
)
命名会话
要创建命名会话,请使用以下命令运行 screen
$ screen -S session_name
要(重新)命名现有会话,请在 screen 运行时运行以下命令
Ctrl+a
:sessionname 会话名称
要打印标识您的 screen 会话的 pid.tty.host 字符串列表
$ screen -list
要附加到命名的 screen 会话,请运行此命令
$ screen -x session_name
或
$ screen -r session_name
自定义 Screen
您可以根据自己的喜好修改 Screen 的默认设置,可以通过个人 .screenrc
文件(其中包含启动时要执行的命令,例如 ~/.screenrc
)或在命令模式下动态修改(例如 Ctrl+a
:vbell off
)。
技巧与窍门
使用 systemd 自动启动
此服务为指定用户自动启动 screen(例如 systemctl enable screen@florian
)。作为系统单元运行此服务非常重要,因为 systemd --user 实例不能保证始终运行,并且会在给定用户的最后一个会话关闭时被终止。
/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
更改转义键
更改默认转义键可能是一个好主意,不仅因为“a”通常用左手小指键入,还因为 Ctrl+a
映射到 GNU Readline 和类似 Bash 的 shell 中的常用命令 beginning-of-line
。
可以使用 ~/.screenrc
中的 escape
选项或 screen
的 -e
选项更改转义键。
例如,如果您发现您很少在 shell 或编辑器中键入 Ctrl+j
,则可以使用 escape ^Jj
将转义键设置为 Ctrl+j
。第二个“j”表示可以通过序列 Ctrl+j
j
将文字 Ctrl+j
发送到终端。对于 Dvorak 键盘用户,Ctrl+t
(escape ^Tt
) 可能会更方便。
更奇特的选项包括 escape ``
,它将转义键设置为 `
,或 escape ^^^
,它将其设置为 Ctrl+^
。
转义键在 Screen 文档中也称为“命令字符”。
从窗口 1 开始
默认情况下,第一个 screen 窗口是 0。如果您宁愿永远不要窗口 0,而是从 1 开始,请在您的配置中添加以下行
~/.screenrc
bind c screen 1 bind ^c screen 1 bind 0 select 10 screen 1
嵌套 Screen 会话
可能会陷入嵌套的 screen 会话中。一个常见的情况:您从 screen 会话中启动 SSH 会话。在 SSH 会话中,您启动 screen。默认情况下,首先启动的外部 screen 会话响应 Ctrl+a
命令。要将命令发送到内部 screen 会话,请使用 Ctrl+a
a
,后跟您的命令。例如
Ctrl+a
a
d
分离内部 screen 会话。Ctrl+a
a
K
杀死内部 screen 会话。
在每个 shell 上启动 Screen
对于 Bash 和 Zsh,在您的别名之前将以下代码段添加到您的 .bashrc
或 .zshrc
中
~/.bashrc or ~/.zshrc
if [[ -z "$STY" ]]; then screen -xRR session_name fi
使用 256 色
默认情况下,Screen 使用 8 色终端模拟器。要启用更多颜色,您需要使用支持它们的终端并设置正确的 term 值。这将使用 terminfo 来描述如何解释 ANSI 转义码。terminfo 数据库结构中必须存在一个条目,ncurses 提供了许多常见的描述,存储在 /usr/share/terminfo/
下。
首先尝试通用值
~/.screenrc
term screen-256color
如果这不起作用,请尝试根据您的终端进行设置。当使用基于 xterm 的终端时
~/.screenrc
term xterm-256color
当使用 rxvt-unicode 时
~/.screenrc
term rxvt-unicode-256color
/usr/share/terminfo/r/rxvt-unicode-256color
由 rxvt-unicode-terminfo 提供,它作为 rxvt-unicode 的依赖项安装。但是,如果您通过 SSH 登录到服务器并在那里运行 screen,则此 terminfo 文件可能在服务器上不可用。在这种情况下,建议将 /usr/share/terminfo/r/rxvt-unicode-256color
复制到服务器上,它可以保存在 ~/.terminfo/
中。作为最后的手段,尝试设置 termcapinfo 代替
~/.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
信息丰富的状态栏
默认状态栏可能有点缺乏信息。您可能会发现这个更有帮助
~/.screenrc
truecolor on hardstatus off hardstatus alwayslastline '%{#00ff00}[ %H ][%{#ffffff}%= %{7}%?%-Lw%?%{1;0}%{1}(%{15}%n%f%t%?(%u)%?%{1;0}%{1})%{7}%?%+Lw%? %=%{#00ff00}][ %{#00a5ff}%{6}%Y-%m-%d %{#ffffff}%{7}%0c%{#00ff00} ]'
状态栏在顶部
~/.screenrc
hardstatus firstline
关闭欢迎消息
~/.screenrc
startup_message off
将您的 hardstatus 行变成动态 urxvt|xterm|aterm 窗口标题
这个很简单;只需将您当前的 hardstatus
行切换到带有通知的 caption
行,并进行相应编辑
~/.screenrc
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007' hardstatus string "screen (%n: %t)" caption always '%{= 7;0}%Y-%m-%d %c %-Lw%{+b 2;0}[%n %t]%{-}%+Lw%=%{-}'
这将使您在终端模拟器的标题中获得类似于 screen (0 bash)
的内容。标题提供日期、当前时间和屏幕窗口集合的颜色。
使用 X 滚动机制
可以使用 Ctrl+a
[
访问 GNU Screen 的滚动缓冲区。但是,这非常不方便。要使用例如 xterm 或 Konsole 的滚动条,请添加以下行 [1]
~/.screenrc
termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@
将现有运行程序附加到 screen
如果您在 Screen 外部启动了一个程序,但现在您希望它在内部,您可以使用 reptyr 将进程从其当前 TTY 重新父化到 screen 内部的 TTY。
获取进程的 PID(您可以使用 ps ax
来获取)。现在只需在 screen 窗口内输入 PID 作为 reptyr 的参数。
$ reptyr pid
在 screen 中设置不同的 bash 提示符
如果您希望在 screen 会话中使用不同的 bash 提示符,请将以下内容添加到您的 .bashrc
中[2]
if [ -z $STY ] then PS1="YOUR REGULAR PROMPT" else PS1="YOUR SCREEN PROMPT" fi
关闭视觉铃声
通过此设置,Screen 将不会进行难看的屏幕闪烁来代替铃声。
~/.screenrc
vbell off
去除垂直和水平条
要去除垂直条
$ ~/.screenrc
rendition so =00
要隐藏水平条,请将背景色和前景色设置为默认值 (d) 并显示空白 (" ")
~/.screenrc
caption string "%{03} "
如果这不起作用,请尝试 caption string "%{00} "
代替。对于黑色和白色的默认标题,请使用 caption string "%{00}%3n %t"
。
故障排除
修复编辑器残留文本
当您在 screen 中打开像 nano 这样的文本编辑器,然后关闭它时,文本可能会保留在您的终端中可见。要解决此问题,请放入以下内容
~/.screenrc
altscreen on
修复窗口列表中的名称列仅显示“bash”
将以下内容添加到 ~/.screenrc
~/.screenrc
windowlist string "%4n %h%=%f"