本文总结和记录了笔者在Linux系统应用过程中常用到的screen命令相关的操作和内容,以做手册和参考之用。
关于Screen
screen,意为"屏幕",是Linux(Unix)系统中的一个终端多路复用工具。它允许用户在一个终端窗口中运行多个独立的终端会话。可以简单的理解它可以基于一个终端或者连接,衍生出多个"虚拟"的终端,并在它们中运行不同的程序和命令,而不需要使用真正的多个终端窗口或者连接。
虽然screen是一个非常常用和基础的工具,但遗憾的是很多发行版却没有将其作为默认软件进行安装。当然大多数软件会将其作为默认软件仓库内的一个成员,所以可能需要在系统安装完成后由管理员手动安装,安装方式和普通软件无异。如在debain上可以使用以下命令进行安装和检查。
js
sudo apt install screen
screen -version
场景
我们已经有了bash、sh作为命令行终端工具,为什么还要使用screen呢。笔者觉得,它是为一些扩展的场景和需求而准备的,下面简单总结几条:
- 防止会话中断
作为一个开发者或者系统运维人员,我们最常用的Linux操作场景,并不是坐在服务器的控制台前面来进行操作,而是通过网络包括互联网进行远程管理,比如使用ssh连接远程终端的方式。如果网络的质量不太好或者其他意外情况发生,在操作过程中,ssh会话被中断,正在执行中的命令和操作,可能也会受到影响或者出错。这时使用screen,基本上就可以解决和避免这个问题。
- 长期或者持久运行
有很多软件的运行模式,就是需要长期和持续运行的,比如网络服务、下载工具、后端音乐播放程序等等。很多时候管理员不希望这些程序影响正常的操作,就可以使用screen命令,将它们放在后台运行,同时可以很方便的恢复操作的界面和状态。
- 共享ssh
显然,如果有多个任务需要执行并监控,或者希望保持操作状态和信息,就可以在一个ssh会话的基础上,使用多个screen来进行管理和切换,非常方便。
- 保持登录状态
如果在screen里面,进行了用户切换(如sudo),这个登录会话状态是可以保持的,下次之间复用这个窗口就可以了。当然这里可能稍微有一点点安全隐患,管理员有责任知晓并了解这个情况。
基本使用
screen的使用的主命令就是screen命令,但需要组合使用命令行参数和键盘快捷方式来执行相关操作。这个工具的一般使用过程和生命周期如下:
- 查看帮助
使用screen -help查看这个命令的帮助信息。如果认真阅读,可以发现里面有很多有趣的内容。
- 启动会话
可以简单的使用screen命令,就可以启动一个新的终端,和启动一个新的会话基本无异。虽然可以以匿名的方式来启动会话,但还是建议创建时提供一个名字(-S参数),方便进行后续的操作和管理。否则就只能使用会话的pid来操作了。
- 分离会话
如果要在会话中进行切换,或者需要临时退出会话到主命令行环境。需要在screen会话中,按下Ctrl-a,然后按下 d,即"Ctrl-a d"。这将使你从screen会话中分离出来,回到会话调用界面,但会话仍在后台运行。
- 查看会话列表
使用-list(-ls)参数,可以显示当前系统中活动的会话列表,包括名称、pid等信息,可以用于关闭或者恢复会话。
- 恢复会话
使用-r命令选项,可以恢复一个存在的会话。恢复会话需要指定会话的pid或者会话名称。
- 退出会话
使用exit命令,可以退出当前会话。也可以使用"Ctrl-d"来达到相同的效果。
相关的操作,在命令行环境中的内容大体如下:
shell
// 创建会话
screen -S newscreen
// 分离会话
ctrl-a d
[detached from 142.newscreen]
// 查看会话列表
$ screen -ls
There is a screen on:
142.newscreen (02/02/2024 04:14:52 PM) (Attached)
1 Socket in /run/screen/S-yanjh.
// 检查screen进程 可以看到相关的pid
$ ps aux | grep screenns.
yanjh 142 0.0 0.0 14904 1364 ? Ss 16:14 0:00 SCREEN -S newscreen
yanjh 150 0.0 0.0 14116 1148 tty1 S 16:17 0:00 grep screen
// 恢复会话
screen -r newscreenh[100]
// 退出会话
$ exit
[screen is terminating]
- 运行程序
创建新的screen会话后,可以使用和终端程序完全相同的方式,执行各种命令行程序和操作。只要不显式的运行exit命令,这个会话将永远存在。如果出现网络中断,重新连接后,可以随时恢复当前状态。
高级操作
除了上述基本应用方式和流程之外,这里列举一些扩展的应用方式,通常用于重度的linux终端用户:
- 会话中创建新会话
在当前会话中,使用"Ctrl-a c"可以创建一个新会话。
- 顺序切换会话
在当前会话中,使用"Ctrl-a p"或者"Ctrl-a n",可以切换到上一个或者下一个窗口会话。
也可以使用"Ctrl-a"查看所有窗口编号,然后使用"Ctrl-a n"切换到对于窗口。
- 强行恢复会话
有时候我们会遇到某个会话可能在另一个连接中,已经被使用了,如果尝试恢复,会收到无法恢复的提示信息。这时可以组合使用 -d -r 命令组合使用,先分离会话,然后在当前连接中恢复。好像也可以直接使用 -x 参数。
- 其他
认真阅读-help信息,可以在其中发现很多有趣的操作选项和操作,但很多功能笔者没有机会实践,读者有兴趣可以自己探索。