掌握GNU Screen

GNU Screen是一个终端多路复用器,一个管理终端窗口的程序。它已经存在了28年,比Perl 5还要老。所以如果你认为Perl有一些过时的约定,那你还没有看到什么。但尽管如此,Screen是管理终端的一个强大工具;如果你经常需要使用多个终端,你欠自己一个开始使用多路复用器以获得重大生产力提升的理由。Screen是最广泛使用的多路复用器,另一个流行的选择是tmux,但本文将介绍Screen。

入门指南

通过在命令行中简单地输入screen来启动Screen。

$ screen

Screen中的所有命令都以前缀Control + a开头。首先要学习的是最重要的命令;如何显示命令菜单!为此,请输入Control + a, ?(即,按住Control键,然后按“A”键,释放按键后输入问号)。如果你记得这个命令,你就可以随时摆脱困境,即使你忘记了其他一些命令。

管理窗口

要打开一个新的终端窗口,请输入Control + a, c。Screen将创建一个新的窗口——这是一个新的终端进程。要查看打开的窗口列表,请输入Control + a, "。你可以按上箭头和下箭头来突出显示你想要使用的窗口,然后按回车键打开它。

你也可以通过按Control + a, n来移动到下一个窗口,按Control + a, p来移动到上一个窗口。每个窗口都分配了一个数字,你可以直接跳转到窗口:Control + a, #,其中井号键是要跳转到的窗口的数字。

最后,如果你想杀死一个窗口,请输入Control + a, k。要杀死所有窗口并退出screen,请输入组合键:Control + a, \

分割屏幕

Screen可以将终端窗口分割成多个窗口。如果你需要同时查看多个终端,这非常有用。任何窗口都可以垂直或水平分割,并且可以多次分割,导致各种组合。要垂直分割屏幕,请输入:Control + a, |,要水平分割,请输入:Control + a, S

要突出显示下一个分割窗口,请输入Control + a, tab(还有一个配置选项可以通过鼠标点击来选择,稍后会详细介绍)。组合键Control + a, Q将退出分割屏幕模式。

复制和粘贴

在Screen中进行复制和粘贴并不特别容易。事实上,我经常发现自己在使用终端复制和粘贴(使用鼠标突出显示,然后按Control + CControl + V)。然而,了解Screen的复制和粘贴是有用的,因为终端复制和粘贴在分割屏幕模式下会崩溃,而且你可能仍然想要使用鼠标选择做一些更有用的操作。

复制和粘贴是模式化的,因此首先你必须进入“复制模式”。为此,请输入Control + a, [。现在将光标移动到你想要复制的文本的开始。按space来标记它,并使用箭头键(或h、j、k、l)将光标移动到你想要复制的文本的末尾。再次按space将复制突出显示的文本。要粘贴,请输入Control + a, ]。哎呀。

滚动

默认情况下,Screen 使用 X-Window 滚动条防止滚动(它也不保留太多历史记录)。这可能会非常令人烦恼,因此您需要了解如何滚动。要这样做,您需要使用 Control + a, [ 进入复制模式,然后按 Control + u 向上滚动,按 Control + d 向下滚动。按 escape 退出复制模式。直到您能记住滚动的组合键,您会发现您将输出管道化到 less 的频率比您想象的要多。

断开 Screen 会话

Screen 会话可以像任何其他终端进程一样放入后台。Screen 将保持打开任何终端进程(如 ssh 会话)。这非常有用——如果您发现自己正在与 5 或 6 个以上的窗口一起工作,断开连接并启动一个新的 screen 会话可能比添加更多窗口更容易。要断开 screen,组合键是 Control + a, d。当您断开连接时,screen 将打印会话名称并返回到终端提示符。要重新连接到一个已断开的会话,只需使用 screen -r

$ screen -r

如果您有多个 screen 会话,可以使用 -ls 显示所有已断开的会话

$ screen -ls
There are screens on:
    30549.pts-1.localhost   (Detached)
    30498.pts-1.localhost   (Detached)
    29207.pts-1.localhost   (Detached)
3 Sockets in /var/run/screen/S-sillymoose.

然后,只需通过将会话名称作为选项提供给 -r,就可以重新连接到所需的会话

$ screen -r 29207

但如果您真的有多个 Screen 会话在运行,记住它们都在做什么可能会有点困难。所以当您启动 Screen 时,请使用 -S 选项为会话命名

$ screen -S aws_ec2

如果您为所有会话命名,就知道要重新连接到哪个会话了

$ screen -ls
There are screens on:
    31155.aws_ec2   (Detached)
    30866.email_servers (Detached)
    30815.ecommerce_app (Detached)
3 Sockets in /var/run/screen/S-sillymoose.

$ screen -r email_servers

自定义 Screen

Screen 可以高度配置,这很好,因为您可能会想更改一些默认选项。然而,您应该考虑的第一个选项根本不是 Screen 的选项。

要停止 ssh 会话超时,请将以下内容添加到您的 ~/.ssh/config 文件中

# dont timeout connections
ServerAliveInternal 600

如果 ~/.ssh/config 文件不存在,您可能需要更改文件的权限

$ chmod 644 ~/.ssh/config

此选项将使 ssh 每隔 10 分钟向远程服务器发送一个字节,以保持会话活跃。您可能需要根据您的需求更改频率。现在您可以在 screen 内拥有多个 ssh 窗口,断开连接数小时后返回,您仍然可以登录。

像许多其他终端程序一样,screen 会查找运行配置文件(~/.screenrc)。我喜欢以下选项

# no welcome message
startup_message off

# keep running processes on detach
autodetach on

# start windows at 1 instead of 0
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1

# large scrollback buffer
defscrollback 5000

# on split screen, switch window focus by clicking
mousetrack on

# refresh screen after closing a program
altscreen on

有大量的选项可供选择。Screen 有一个庞大的在线 手册,它的终端 man 页也非常全面。手册中列出的任何键入命令都可以在 screen 内运行,或添加到 ~/.screenrc 文件中。例如,如果您不喜欢 Screen 的默认键绑定,可以检查 bindkey 命令来覆盖它们,因为您不希望在接下来的 28 年里再次键入它们。

Screen 技巧表

# Type before other commands
Prefix: Control + a

Shortcuts menu: ?

New window:    c      Split Vertical:   |       Copy mode:     [
Close window:  k      Split Horizontal: S       Start copy:    space
Next window:   n      Focus next region: tab    Scroll up:     u
Prior window:  p      Quit split screem: Q      Scroll down:   d
Jump window #: 0-9                              End copy:      space
List windows:  "                                Paste:         ]
                                                End copy mode: escape

Detach: d
Quit:   \

# Terminal commands
Launch Screen:     screen
Named session:     screen -S <name>
List sessions:     screen -ls
Re-attach session: screen -r [name]


这篇文章最初发布在 PerlTricks.com 上。

标签

David Farrell

David 是一名专业程序员,他经常 推文博客 关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?通过在 GitHub 上打开问题或拉取请求来帮助我们。