Screen使用心得
主要功能说明
Screen
是一款用于命令行终端切换的自由软件,用户可以通过该软件同时链接多个本地或远程的命令行会话,并在其之间自由切换。
会话恢复
只要 screen
本身没有终止,再其内部运行的会话都可以恢复。这一点为 ssh 登录的用户提供了便利。
大多数人使用 Linux 命令行的场景都是在租赁了远程 Linux 服务器的情况。在这种情况下,一旦网络连接中断抑或是退出 ssh 链接,都会使当前的命令行会话结束
而在 screen
中运行的会话会在远程链接结束的情况下自动执行 Detach
操作,将当前会话分离,让 screen
挂起(转入后台)
screen
的工作方式与图形化界面下的VNC
工作模式很相似。
多窗口
在 Screen 环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
Screen 实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
会话共享
Screen 可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
使用 screen
screen -S yourname -> 新建一个叫 yourname 的 session
screen -ls -> 列出当前所有的 session
screen -r yourname -> 回到 yourname 这个 session
screen -d yourname -> 远程 detach 某个 session
screen -d -r yourname -> 结束当前 session 并回到 yourname 这个 session
启动 screen
直接敲命令screen
就可以启动它。但是这样启动的会话没有名字,推荐为每个screen
会话取一个名字,方便分辨:
1 | macbook @ Ansel-MacBook in ~ [21:39:17] |
screen 启动后,会创建第一个窗口,也就是窗口 No. 0,并在其中打开一个系统默认的 shell。所以你敲入命令 screen 之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入 Screen 了。当然,也可以在 screen 命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:
1 | macbook @ Ansel-MacBook in ~ [21:40:33] |
screen 创建一个执行vim hello.md
的单窗口会话,退出vim
将退出该窗口/会话。
会话分离与恢复
你可以不中断 screen 窗口中程序的运行而暂时断开(detach)会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序
会话分离
例如,我们打开一个 screen 窗口编辑hello.md
文件:
1 | macbook @ Ansel-MacBook in ~ [21:53:43] C:1 |
在 screen 窗口键入C-a d
,这个快捷键执行Detach
操作,Screen 会给出 detached 提示:
1 | [detached] |
会话恢复
找到上一小节创建的 screen 会话:
1 | macbook @ Ansel-MacBook in ~ [22:03:52] C:130 |
重新连接会话:
1 | macbook @ Ansel-MacBook in ~ [22:05:06] C:1 |
从这里就可以看出启动的时候使用
-S
参数为会话命名的必要性了,使用别名会大幅度提升恢复会话的速度,同时也使可读性提升
当然,如果你在另一台机器上没有分离会话,就无从恢复会话了。
Attached 模式表示当前会话已经被连接,无法恢复
1 | macbook @ Ansel-MacBook in ~ [22:08:50] |
这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:
1 | macbook @ Ansel-MacBook in ~ [22:09:09] C:1 |
其中-d
参数会远程断开连接,对应的连接用户会看见一条提示[remote detached]
,-d
与-r
组合使用就可以强制分离一个会话并转移到当前终端
关闭或杀死窗口
正常情况下,当你退出一个窗口中最后一个程序(通常是 bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k
,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
如果一个 Screen 会话中最后一个窗口被关闭了,那么整个 Screen 会话也就退出了,screen 进程会被终止。
除了依次退出/杀死当前 Screen 会话中所有窗口这种方法之外,还可以使用快捷键C-a
:,然后输入quit
命令退出 Screen 会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。
而这种方式是上面那种方式的另一种实现,可以精准退出某一个会话。
1 | screen -S session_name -X quit |
C-a :
这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入 split 等,这也是实现 Screen 功能的一个途径。
查看窗口和窗口名称
在每个 screen session 下,所有命令都以
Ctrl+a(C-a)
开始。
打开多个窗口后,可以使用快捷键C-a w
列出当前所有窗口。
1 | 0- ~/Code 1* screen |
其中*
代表当前活动的窗口
Screen 默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。但各个窗口可以有不同的名字以方便区分。
使用快捷键C-a A
来为当前窗口重命名,按下快捷键后,Screen 会允许你为当前窗口输入新的名字,回车确认。
清除 dead 会话
如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -ls
会显示该会话为dead
状态。使用screen -wipe
命令清除该会话
语法
1 | screen -AmRvx -[ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>] |
选项
选项 | 说明 |
---|---|
-A | 将所有的视窗都调整为目前终端机的大小。 |
-d <作业名称> | 将指定的 screen 作业离线。 |
-h <行数> | 指定视窗的缓冲区行数。 |
-m | 即使目前已在作业中的 screen 作业,仍强制建立新的 screen 作业。 |
-r <作业名称> | 恢复离线的 screen 作业。 |
-R | 先试图恢复离线的作业。若找不到离线的作业,即建立新的 screen 作业。 |
-s | 指定建立新视窗时,所要执行的 shell。 |
-S <作业名称> | 指定 screen 作业的名称。 |
-v | 显示版本信息。 |
-x | 恢复之前离线的 screen 作业。 |
-ls 或–list | 显示目前所有的 screen 作业。 |
-wipe | 检查目前所有的 screen 作业,并删除已经无法使用的 screen 作业。 |
常用 screen 参数
1 | C-a ? -> 显示所有键绑定信息 |