SSH/Shell都属于支持远程访问其他系统上其他用户的方法,在专业术语中,通过SSH连接到远程系统并执行命令时,会创建一个伪终端(pseudo-terminal),将其附加到远程用户的登录shell。当SSH会话结束或超时,伪终端会发送SIGHUP信号,导致所有相关作业被终止。为了在断开连接后保持SSH会话活跃,可以采用五种方法来避免SIGHUP信号的发送,从而保持作业运行。
当配置忽略这个信号的作业才会在会话终止后继续存在。Linux系统中,可以通过多种方式让这些作业在用户注销/会话终止后仍在远程服务器/任意机器中继续运行。
Linux上进程有类型有正常进程,孤儿进程、守护进程。正常进程就是那些有会话生命周期的进程,在会话期间作为前台进程启动,在特定时间跨度/会话注销时结束。这些进程的所有者属于系统任何有效用户,如root。
孤儿进程是指那些原本由父进程创建,但后来因为父进程终止而失去父进程的进程。在这种情况下,系统的init进程(进程ID为1)会成为孤儿进程的新父进程。Init进程负责监控这些孤儿进程,直到它们结束执行。
这些是被设计为独立运行的进程,称为守护进程。它们被特意配置为在启动后与控制终端断开连接,以便在后台持续运行,直到任务完成或出现错误。这些进程的父进程会故意结束,让子进程继续在后台执行。
想要断开连接后还可以实现SSH会话运行的方法较多,如可以通过screen。screen属于Linux的一个文本窗口管理器,支持用户同时管理多个终端会话,在会话之间切换,记录下屏幕正在运行的会话,还可以实现任意时间恢复会话,不会出现会话注销/终端关闭的情况。
screen会话启动后可以从控制终端分离在后台中运行,也可以随时甚至在任意地方恢复。只要screen中启动会话,在需要时把其从伪终端/控制终端中分离并注销。当需要时候再重新登录和恢复会话。
输入“screen”命令会新启动一个screen会话,用户可以创建新窗口、在窗口之间相互移动、锁定屏幕及执行在普通终端上执行更多操作:
$ screen
当屏幕会话启动,可以运行任何命令并通过分离会话来保持会话运行。如果想退出远程会话,但又想保持在该机器中创建的会话处于活动状态,可以把屏幕和终端分离,实现不被中断控制。用“Ctrl+a”立即按下“d”,看屏幕出现分离消息就可以安全注销保持会话。
如果需要恢复注销前离开的独立屏幕会话,只要重新登录远程,再输入screen r打开一个屏幕,如果需要打开多个屏幕运行:
$ 屏幕 -r <pid.tty.host>
Tmux可以用来替代screen软件,Tmux具备大部分screen功能还额外增加了其他强大附加功能,比如支持多个窗口之间水平或垂直分割窗格、调整窗格大小、会话活动监视、使用命令行模式编辑脚本等。可以在Linux中新打开一个窗口执行:
$ tmux
在终端上执行操作后就可以把该会话和控制终端分离。便于进入后台后可以安全注销。 tmux 会话上运行“tmux detach”,也可以使用快捷方式(Ctrl+b then d)。此后,您的当前会话将被分离,您将返回到终端,然后可以安全地注销。
$ tmux detach