如何正确使用GNU Screen?需要了解哪些内容?

108

我刚向一个朋友介绍了GNU Screen,他很难适应它。这让我想到了关于这个出色的Screen实用程序,他需要知道的基本事项,也就是你会认为值得从头开始教给初学者的东西。有哪些类比和方便的提示来记住绑定等内容?

那将是非常棒的。


1
这里也有一些很好的答案:https://dev59.com/zkXRa4cB1Zd3GeqPpSVw - Chris
有人在Server Fault上发布了一个类似的问题。 - Vagnerr
如果有人刚开始使用并且在使用Screen时遇到了困难,他们可能想要尝试一下替代品tmux - Christopher Bottoms
18个回答

96

我使用Screen已经超过10年了,但可能只使用了不到一半的功能。因此,当然没有必要立即学习所有的功能(我也不建议尝试)。我日常使用的命令有:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

我觉得就是这样。我有时候使用分屏功能,但肯定不是每天都用。另一个提示是,如果屏幕似乎因为您意外按下某些随机键组合而锁死了,请同时按下^Q^A ^Q尝试解锁。


1
应该向列表中添加一个 k 来关闭窗口。 - Léo Léopold Hertz 준영
7
因为有可能误操作导致意外杀死多个进程,所以我不使用'^A k'命令。相反,我会在窗口中使用'^D'(或exit)命令退出shell,这样屏幕窗口会在退出最后一个shell后自动关闭。 - Greg Hewgill
9
^A esc是复制模式,我用它来滚动查看之前的内容。您是男人中的神话。 - Rob Howard
4
^A【完全相同的操作】。 - atx
非常感谢您的^A^Q!!!此外,我想添加到这个列表中:^A d - 分离屏幕,使其保持运行状态。然后您可以注销 shell 并且您的进程仍将运行,然后您可以使用 'screen -r [pid]' 重新附加屏幕。您还可以在启动时为屏幕命名,使用 'screen -S screen_name'。我留了一个名为 'LogFiles' 的屏幕在运行,跟踪多个日志文件,因此当我想查看所有日志时,只需重新附加并重新拆分屏幕即可。 - siliconrockstar
显示剩余3条评论

38

在找到一种方法在屏幕底部设置“状态栏”后,我才逐渐适应了屏幕。它可以显示您所在的“标签页”或“虚拟屏幕”,以及其他屏幕的信息。以下是我的设置:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

3
请尝试使用byobu(screen-profiles),链接为https://launchpad.net/byobu。 - Drew Stephens
太棒了,谢谢。我一直在努力弄清楚当我尝试分割我的终端时实际上正在发生什么。我没有意识到需要先运行screen才能使任何这些命令起作用,很傻,我知道。 - Ogaday

30

Ctrl+A 是什么?- 显示帮助界面!


我完全同意这个观点。这比其他答案更有用,因为你可以通过它推导出其他的命令,而反过来则不行。此外,这也更容易记住。 - Léo Léopold Hertz 준영

26
如果你的朋友习惯于在Bash中按下“^A”以到达行的开头,他/她将会遇到一些意外,因为“^A”是屏幕命令键绑定。通常我最终会得到一个冻结的屏幕,可能是由于在“^A”后按了一些随机键 :-)。
在这种情况下,我尝试使用“^A s”和“^A q”来阻止/取消阻止终端滚动,以解决问题。要在屏幕内部前往行的开头,则需要使用键序列“^A a”。

1
将转义字符从^A更改为其他字符非常容易。我已经在我的答案中提供了详细信息。 - Andrew Johnson
1
@agnul +1 给你,因为 ^A a 这个提示对我很有用。在普通的 bash 会话中,我是 ^A 的用户,但在 screen 会话中无法使用它。感谢这个好建议! :) - icasimpan
非常感谢您告诉我如何在屏幕内使用Ctrl A,我要向您道100次谢。这是我一生中一直在寻找的。 - user674669
这里的 'A' 和 'a' 区分大小写吗? - Aditya M P
感谢您开始行键序列!非常有帮助。 - JPC

12
你可以将Esc键从Ctrl+A重新映射为另一个键,因此如果您将其用于其他用途,例如在bash中转到行的开头,只需向您的~/.screenrc文件添加一行即可。 要将其设置为^b或^B,请使用:
escape ^bB

使用命令行,使用名字会话来控制多个会话。我为每个任务使用一个会话,每个会话有多个标签页:

  screen -ls         # 列出当前的screen会话
  screen -S <name>   # 创建一个名为name的新screen会话
  screen -r <name>   # 连接到指定的screen会话

使用 screen 时,您只需要几个命令:

  ^A c          创建一个新shell
  ^A [0-9]      切换shell
  ^A k          关闭当前的shell
  ^A d          断开与screen的连接
  ^A ?          显示帮助信息

可以在此处找到一个很好的快速参考指南。值得收藏。


我使用嵌套的屏幕会话。我使用 screen -e^oo 启动外部屏幕会话,这样我就可以使用 Ctrl+O,然后使用 screen -m 启动内部屏幕会话,以便它们启动新会话。 - staticsan
1
您可以随时更改转义键。在运行的screen会话中,键入 ^A : ,然后输入 \Bb,最后按Enter键将转义键设置为 ^B。通常,^A : 允许您执行.screenrc能够理解的指令。 - malana

8

以下是一些针对熟悉screen但容易忘记man手册内容的人的技巧:

  • 更改screen窗口名称非常容易:ctrl+Ashift+A
  • 错过了screen的最后一条消息?使用ctrl+actrl+m将再次显示它。
  • 如果您想运行某个东西(如跟踪文件)并希望在有变化时得到通知,请在目标窗口上使用ctrl+Ashift+m。注意:它会让你知道如果任何东西发生了变化。
  • 想要直接选择第15个窗口吗?在您的.screenrc文件中尝试以下操作:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

ctrl+ashift+0到9 分配给 Windows 10 到 19。


7

Ctrl+A 是基本命令

Ctrl+A N = 跳转到下一个屏幕

Ctrl+A P = 跳转到上一个屏幕

Ctrl+A C = 创建新的屏幕

Ctrl+A D = 分离当前屏幕


6

链接(实际上)已经断开:$VAR1 = \'无法通过套接字 \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused")连接到本地MySQL服务器,位于../lib/Singleton/DBI.pm的第95行。 '; - Peter Mortensen

6
我必须补充一点:添加。
bind s

如果您像我一样习惯使用分屏窗口,将以下内容添加到您的.screenrc文件中可能会有所帮助:C-a S可以将当前窗口分割成两个,而C-a s则会冻结当前窗口。因此,我禁用了冻结快捷键。


2
如果你按下 ^-S,则 ^-Q 将解除冻结。 - Plato
你说得对,@Plato。但我现在在一个用户环境中工作,他们几乎不会记住任何快捷键…… 所以我需要将其禁用。 - Zsolt Botykai
NP,我刚刚发现了这个帖子,搜索了“freeze”,但没有找到我想要的内容。 - Plato

6

Ctrl+a是一个特殊的键。

Ctrl+a d - [d]etach,将程序(如irssi)留在后台并回家。

Ctrl+a c [c]reate创建一个新窗口 Ctrl+a 0-9按编号在窗口之间切换

screen -r - 返回到分离的会话

以上内容涵盖了90%的使用情况。不要试图一次展示所有功能。


虽然我第一次了解screen时对于“分离”和“重新连接”屏幕的实际含义感到困惑。引用:“...您可以在给定机器上的单独控制台(如远程机器上的ssh,IRC会话等)中运行长时间运行的任务,在会话中分离,从一个物理位置移动到另一个位置,通过ssh连接到机器并重新连接到屏幕会话以继续工作。” - JW.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接