GNU Screen
GNU Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间复用一个物理终端。Screen 中运行的程序在其窗口当前不可见时仍可继续运行,甚至在整个屏幕会话从用户终端分离时也是如此。
有关功能的描述,参阅官方概述 GNU Screen 手册。
输入命令时按下 "转义键 "Ctrl+a,然后进行键绑定。
有些用户认为默认的转义键 Ctrl+a 不方便。可以按照 #更改转义键中的说明,将转义键更改为其他键。
Ctrl+a?显示命令及其默认值Ctrl+a:进入屏幕命令提示符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 的默认设置在一个包含了要在启动时运行的命令的 .screenrc 文件里,或者在命令模式下修改(如 Ctrl+a :vbell off)。
此服务将会为指定用户自启动 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 被绑定了常用命令 beginning-of-line 在 GNU Readline 和类 Bash 的 Shell 里。
转义键可以在 ~/.screenrc 中使用 escape 项来更改,或者给 screen 传入 -e 选项。
例如,如果您发现您很少使用 Ctrl+j 组合键在您的 Shell 和编辑器中,您就可以用 escape ^Jj 把转义键设定为 Ctrl+j。第二个 “j” 表示,您可以通过依次按下 Ctrl+j 和 j 的按键序列,向终端发送一个原始的 Ctrl+j 信号。对于 Dvorak 键盘布局的用户,Ctrl+t(escape ^Tt)可能会更方便。
比较少见的包括 escape `` 可以把转义键设定为 `,或者 escape ^^^ 可以将其设定为 Ctrl+^。
在 Screen 的文档中,转义键也被叫作“指令字符”(command character)。
默认情况下,第一个窗口是0。如果您更希望从窗口1启动而不是窗口0, 请在您的配置文件中添加以下内容:
~/.screenrc
bind c screen 1 bind ^c screen 1 bind 0 select 10 screen 1
在一个嵌套的 Screen 会话当中很可能被卡住。一个很现实场景:当您从一个 Screen 会话中打开一个 SSH 会话时,在这个 SSH 会话下又开了一个 Screen会话。默认情况下,外面启动的 Screen 会话会先接受 Ctrl+a 命令. 要给内部的 Screen 会话发送命令,请使用 Ctrl+a a,接着输入您的命令。例如:
Ctrl+aad脱离内部的 Screen 会话。Ctrl+aaK终止内部的 Screen 会话。
对于 Bash 和 Zsh,在您的 .bashrc 或 .zshrc 中设定命令别名之前请加入以下片段:
~/.bashrc or ~/.zshrc
if [[ -z "$STY" ]]; then screen -xRR session_name fi
默认情况下,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 is provided by rxvt-unicode-terminfo包, which is installed as a dependency of 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 行切换为 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 窗口。
要滚动 Screen 的缓冲区可以使用 Ctrl+a [。然而,这非常的不方便。要使用如 xterm 或者 Konsole 的滚动条,请添加以下内容 [1]:
~/.screenrc
termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@
如果您在 Screen 外运行了一个程序,但是现在想将此放在 Screen 中运行,您可以使用 reptyr 来将当前的 TTY 重新分配进 Screen 中。
获得对应进程的 PID (您可以使用 ps ax 命令获取)。现在只需要把对应的 PID 作为 reptyr 的参数即可将进程放入 Screen 中。
$ reptyr pid
如果您希望在 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"。
在屏幕中打开文本编辑器(如 nano),然后关闭它时,文本可能会在终端中保持可见。要解决这个问题,请执行以下操作:
~/.screenrc
altscreen on
向 ~/.screenrc 添加以下内容:
~/.screenrc
windowlist string "%4n %h%=%f"