GNU Screen
GNU Screen 是一个全屏窗口管理器,可在多个进程之间多路复用一个物理终端,通常是交互式 shell。在 Screen 中运行的程序在当前不可见时,甚至在整个 Screen 会话与用户终端分离时,仍会继续运行。
有关功能的描述,请参阅官方概述 GNU Screen 手册。
安装
用法
命令的输入方式是按下“转义键”Ctrl+a,然后是按键绑定。
一些用户认为默认的转义键Ctrl+a不方便。转义键可以更改为其他键,如#更改转义键中所述。
常用命令
Ctrl+a?显示命令及其默认值Ctrl+a:进入 Screen 的命令提示符Ctrl+a"窗口列表Ctrl+a0打开窗口 0Ctrl+aA重命名当前窗口Ctrl+aa将Ctrl+a发送到当前窗口Ctrl+ac创建一个新窗口(带 shell)Ctrl+aS将当前区域水平分割成两个区域Ctrl+a|将当前区域垂直分割成两个区域Ctrl+atab将输入焦点切换到下一个区域Ctrl+aCtrl+a在当前区域和上一个区域之间切换Ctrl+aEsc进入复制模式(使用 Enter 选择文本范围)Ctrl+a]粘贴文本Ctrl+aQ关闭除当前区域外的所有区域Ctrl+aX关闭当前区域Ctrl+ad分离当前 Screen 会话,并使其继续运行。使用screen -r恢复
命令提示符命令
Ctrl+a:quit关闭所有窗口并退出 Screen 会话Ctrl+a:source ~/.screenrc重新加载 screenrc 配置文件(也可以使用/etc/screenrc)
命名会话
要创建命名会话,请使用以下命令运行 screen
$ screen -S session_name
要(重新)命名现有会话,请在 Screen 运行时运行以下命令
Ctrl+a :sessionname session_name
要打印识别您的 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+aad分离内部 Screen 会话。Ctrl+aaK杀死内部 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)的内容作为终端模拟器的标题。caption 提供日期、当前时间和您 Screen 窗口集合的颜色。
使用 X 滚动机制
GNU Screen 的滚动缓冲区可以通过Ctrl+a [访问。然而,这非常不方便。要使用例如 xterm 或 Konsole 的滚动条,请添加以下行 [1]
~/.screenrc
termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@
将现有运行程序附加到 Screen
如果您在 Screen 之外启动了一个程序,但现在希望它在 Screen 内部,您可以使用reptyr将进程从其当前 TTY 重新父化到 Screen 内部的一个。
获取进程的 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,请使用caption string "%{00}%3n %t"。
故障排除
修复残留的编辑器文本
当您在 Screen 中打开像 nano 这样的文本编辑器然后关闭它时,文本可能会保留在您的终端中。要解决此问题,请添加以下内容
~/.screenrc
altscreen on
修复窗口列表中 Name 列只显示“bash”的问题
将以下内容添加到~/.screenrc
~/.screenrc
windowlist string "%4n %h%=%f"