本文共 1940 字,大约阅读时间需要 6 分钟。
在Linux/Unix环境中,关闭SSH终端窗口或断开网络连接会导致正在运行的程序或会话被终止的原因在于SIGHUP(挂断信号)。这种信号默认的行为是终止当前会话的前台进程组,从而导致远程会话被中断。在许多场景中,尤其是在执行长时间运行的任务(如系统备份、文件传输等)时,这种行为会造成不小的麻烦。要避免这种问题,我们可以通过使用screen或者类似的终端多路复用工具来管理远程会话,确保程序能够继续运行且不会因信号而被终止。
在POSIX.1规范下,当终端接口检测到网络连接断开或控制终端关闭时,会向会话期的控制进程发送SIGHUP信号。控制进程是会话的首进程,其关注的是与终端交互的前台进程组。默认情况下,SIGHUP信号会导致控制进程终止,从而终止整个会话期。这个机制可能导致正在运行的程序或会话被立即终止,尤其是在长时间运行的任务中,这种中断可能会带来不稳定性或数据丢失。
为了避免因SIGHUP信号中的断开而导致的程序中断,我们可以使用screen(GNU Screen)这个强大的终端多路复用工具。screen允许我们在一个物理终端或用户界面上创建多个独立的窗口,就像在使用多个SSH终端窗口一样,但又可以管理在后台运行的会话。screen提供了多种功能,可以满足我们在远程环境中管理长时间运行任务的需求。
screen创建一个全屏的终端窗口,然后在其中执行所需的任务。例如:
screen
这将打开一个全屏的 bash shell窗口。你可以在其中使用任何命令或脚本,如:
screen ftp files.example.com
如果你想将窗口切换到另一个任务(如编辑文档),你可以在任何时候键入 C-a c
(Ctrl+a,a)切换到新窗口。
也可以通过screen直接指定要执行的命令并后台运行:
screen mycommand &
这将启动mycommand
命令,并将其输出重定向到屏幕上。你可以在同一时间继续执行其他任务。
如果你需要在同一个screen会话中管理多个任务,可以在screen窗口中使用快捷键切换至新的窗口。例如:
创建一个窗口并运行ftp:
screen ftp files.example.com
进入ftp窗口后,按下 C-a c
(Ctrl+a,a)创建一个新窗口,并运行top:
C-a cscreen top
退出ftp窗口后,键入 C-a c
切换回top窗口,再键入 C-a d
暂时断开screen会话。
screen提供了强大的定制能力,可以满足更复杂的需求:
定义命令字符和转义字符:可以通过-e
选项设置自己的命令字符和转义字符,例如:
screen -e^t
这会将Ctrl+t视为命令字符,t为转义字符。
输入加密:可以选择是否启用输入加密,确保远程会话的安全性。
多用户模式:screen默认是单用户模式,但可以通过配置文件开启多用户模式,以支持多个用户同时连接到同一会话。
会话保存和恢复:可以将screen会话暂时断开,而不终止运行中的程序。断开后,可以通过screen -r
重新连接会话。
###.screen的常用命令
screen -ls
:列出所有可用的screen会话。screen -r [pid].tty.host
:重新连接特定的screen会话。screen -d
:断开当前screen会话。screen -m
:启动一个以断开模式开始的screen会话,可以后续重新连接。screen -w
:启动一个全屏的screen窗口。screen最主要的作用是为我们提供一个能够在多个进程之间切换的终端窗口管理器。这类似于传统的SSH终端,但带有更多功能。特别是在远程备份、文件传输等任务中,screen能够帮助我们避免因网络中断而中断任务的烦恼。
为了充分利用screen的功能,可以参考其文档进行配置。screen的默认配置通常已经足够,即$HOME/.screenrc
,但你可以根据需求进行定制。例如,可以配置screen以自动启动特定的窗口或设置默认的显示选项。
使用screen来管理远程会话可以有效避免因SIGHUP信号而导致的程序终止问题。无论是需要长时间运行的批处理任务,还是需要同时管理多个远程任务的交互式工作,screen都可以提供灵活而强大的解决方案。仅仅需要记住screen的快捷键和命令,就能充分发挥其潜力。
转载地址:http://elwfk.baihongyu.com/