网站搜索

断开连接后保持远程 SSH 会话和进程运行的 5 种方法


简单来说,SSHSecure Shell 是一种人们可以远程访问其他系统上的其他用户的方式,但只能在命令行(即非 GUI 模式)下进行。用更专业的术语来说,当我们通过 ssh 连接到其他系统上的其他用户并在该计算机上运行命令时,它实际上会创建一个伪终端并将其附加到登录用户的登录 shell。

当我们退出会话或会话闲置一段时间后超时时,SIGHUP信号会发送到伪终端以及该终端上运行的所有作业,甚至在伪终端上启动其父作业的作业也会收到 SIGHUP 信号并被强制终止。

不要错过: 保持 SSH 服务器安全和受保护的 5 个有用实践

只有配置为忽略此信号的作业才能在会话终止后幸存下来。在Linux系统上,我们可以有很多方法让这些作业在远程服务器或任何机器上运行,即使在用户注销和会话终止之后也是如此。

了解 Linux 上的进程

正常流程

正常进程是具有会话生命周期的进程。它们在会话期间作为前台进程启动,并在特定时间跨度或会话注销时结束。这些进程的所有者是系统的任何有效用户,包括 root。

孤儿进程

孤立进程是那些最初有创建该进程的父进程的进程,但一段时间后,父进程无意中死亡或崩溃,使 init 成为该进程的父进程。此类进程将 init 作为其直接父进程,等待这些进程直到它们死亡或结束。

守护进程

这些是一些故意孤立的进程,此类故意在系统上运行的进程称为守护进程或故意孤立进程。它们通常是长时间运行的进程,一旦启动,然后与任何控制终端分离,以便它们可以在后台运行,直到它们未完成或最终抛出错误。此类进程的父进程故意死亡,使子进程在后台执行。

在断开连接后保持 SSH 会话运行的技术

有多种方法可以让 ssh 会话在断开连接后继续运行,如下所述:

1. 使用 screen 命令保持 SSH 会话运行

screen 是一个用于 Linux 的文本窗口管理器,它允许用户同时管理多个终端会话、在会话之间切换、在屏幕上运行会话的会话日志记录,甚至在我们需要的任何时候恢复会话不用担心会话被注销或终端被关闭。

屏幕会话可以启动,然后与控制终端分离,让它们在后台运行,然后在任何时间甚至任何地点恢复。只需在屏幕上启动会话,然后在需要时将其与伪终端(或控制终端)分离并注销即可。当您感觉良好时,您可以重新登录并恢复会话。

启动屏幕会话

输入'screen'命令后,您将进入一个新的屏幕会话,在此会话中您可以创建新窗口、在窗口之间遍历、锁定屏幕以及执行更多您可以执行的操作一个普通的终端。

screen

屏幕会话启动后,您可以运行任何命令并通过分离会话来保持会话运行。

拆卸屏幕

当您想要注销远程会话,但又想保持在该计算机上创建的会话处于活动状态时,您需要做的就是将屏幕与终端分离,以便它不再有控制终端。完成此操作后,您可以安全地注销。

要从远程终端分离屏幕,只需按“Ctrl+a”,然后立即按“d”,您将返回到终端,看到屏幕显示消息是分离的。现在您可以安全地注销并且您的会话将保持活动状态。

恢复分离的屏幕会话

如果您想恢复注销前离开的分离屏幕会话,只需再次重新登录远程终端并键入 “screen -r ” 以防仅打开一个屏幕,并且如果打开多个屏幕屏幕会话打开运行“screen -r

screen -r
screen -r <pid.tty.host>

要了解有关 screen 命令及其使用方法的更多信息,请点击链接:使用 screen 命令管理 Linux 终端会话

2. 使用 Tmux(终端多路复用器)保持 SSH 会话运行

Tmux 是另一个软件,旨在替代 screen。它具有screen的大部分功能,以及一些使其比screen更强大的附加功能。

除了屏幕提供的所有选项之外,它还允许在多个窗口之间水平或垂直分割窗格、调整窗口窗格大小、会话活动监控、使用命令行模式编写脚本等。由于 tmux 的这些功能,它已被近乎广泛采用。所有 Unix 发行版,甚至它已包含在 OpenBSD 的基本系统中。

启动 Tmux 会话

在远程主机上执行 ssh 并输入 tmux 后,您将进入一个新会话,并在您面前打开一个新窗口,您可以在其中执行在普通终端上执行的任何操作。

tmux

在终端上执行操作后,您可以将该会话与控制终端分离,以便它进入后台,您可以安全地注销。

从终端分离 Tmux 会话

您可以在运行 tmux 会话时运行“tmux detach”,也可以使用快捷方式(Ctrl+b then d)。此后,您当前的会话将被分离,您将返回到可以安全注销的终端。

tmux detach

恢复关闭的 Tmux 会话

要重新打开您在退出系统时分离并保持原样的会话,只需重新登录到远程计算机并输入“tmux Attach”即可重新附加到已关闭的会话,然后仍将在那里并运行。

tmux attach

要了解有关 tmux 以及如何使用它的更多信息,请点击链接:使用 Tmux 终端多路复用器管理多个 Linux 终端。

3. 使用 nohup 命令继续运行 SSH 会话

如果您不太熟悉 screentmux,您可以使用 nohup 并将长时间运行的命令发送到后台,以便您可以继续该命令将继续在后台执行。之后您就可以安全地注销了。

使用 nohup 命令,我们告诉进程忽略 ssh 会话终止时发送的 SIGHUP 信号,从而使该命令即使在会话注销后仍然存在。会话注销时,该命令将从控制终端中分离出来,并继续作为守护进程在后台运行。

在后台使用nohup执行命令

这里是一个简单的场景,其中我们使用 nohup 运行 find 命令在 ssh 会话的后台搜索文件,之后任务被发送到后台,提示立即返回,给出 PID 和作业 进程ID([JOBID] PID)

nohup find / -type f $gt; files_in_system.out 2>1 &

恢复会话以查看作业是否仍在运行

当您再次重新登录时,您可以检查命令的状态,使用'fg %JOBID'将其返回前台以监控其进度等等。下面的输出显示作业已完成,因为重新登录时不会显示,并且已给出显示的输出。

fg %JOBID

4. 使用 disown 命令保持 SSH 会话运行

让命令或单个任务在后台运行并即使在会话注销或断开连接后仍保持活动状态的另一种优雅方法是使用 disown

Disown,从系统的进程作业列表中删除该作业,这样该进程就不会在会话断开期间被杀死,因为它不会在以下情况下收到 shell 的 SIGHUP你退出。

此方法的缺点是,它只能用于不需要来自 stdin 的任何输入,也不需要写入 stdout 的作业,除非您专门重定向作业输入和输出,因为当作业尝试与 stdinstdout 交互时,它会停止。

在后台使用 disown 执行命令

下面,我们向后台发送 ping 命令,以便 ut 继续运行并从作业列表中删除。如图所示,该作业首先被挂起,之后它仍以 进程 ID:15368 的形式出现在作业列表中。

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

在将该拒绝信号传递给作业后,它从作业列表中删除,但仍在后台运行。当您重新登录远程服务器时,作业仍将运行,如下所示。

ps -ef | grep ping

5. 使用setsid命令运行SSH会话

实现所需行为的另一个实用程序是setsidNohup 有一个缺点,即进程的进程组保持不变,因此使用 nohup 运行的进程很容易受到发送到整个进程组的任何信号的影响(例如 Ctrl + C)。

另一方面,setsid为正在执行的进程分配一个新的进程组,因此创建的进程完全位于新分配的进程组中,并且即使在会话注销后也可以安全地执行而不必担心被杀死。

使用setsid执行任何命令

此处,它显示进程‘sleep 10m’自创建以来已与控制终端分离。

setsid sleep 10m
ps -ef | grep sleep

现在,当您重新登录会话时,您仍然会发现该进程正在运行。

ps -ef | grep [s]leep

结论

即使从 SSH 会话注销后,您可以考虑哪些方法来保持进程运行?如果您能想到任何其他有效的方法,请在评论中提及。