怎么保持SSH会话在断开连接后持续运行?

AI 概述
SSH登录系统时创建的伪终端,在会话终止时会发送SIGHUP信号,导致相关任务终止。为让任务在会话终止后继续运行,可采用以下方法:screen和tmux工具提供会话管理,支持任务恢复;nohup使任务忽略SIGHUP信号,在后台运行;disown将后台任务转为孤儿进程,避免受SIGHUP影响;setsid创建独立会话,使进程不受终端信号影响。根据实际需求,选择合适的方法可以确保任务持续运行。
目录
文章目录隐藏
  1. 1.理解 Linux 系统中的进程
  2. 2.实际应用场景

怎么保持 SSH 会话在断开连接后持续运行?

SSH(Secure Shell)简单来说是一种通过命令行(非图形界面模式)远程访问其他系统的方式。

从技术的角度看,当我们通过SSH登录到另一系统并执行命令时,该系统会创建一个伪终端(PTY),并将其附加到登录用户的 Shell 上。

当我们注销登录或会话因空闲超时时,系统会向伪终端发送SIGHUP信号。在该终端上运行的所有任务也会接收到SIGHUP信号并被终止。

在伪终端上启动的父进程所创建的任务同样会收到此信号并被终止。

只有那些被配置为忽略SIGHUP信号的任务才能在会话终止后继续存活。在 Linux 系统中,有几种方法可以让任务在远程服务器上持续运行,即使我们已注销登录且会话已终止。

1.理解 Linux 系统中的进程

1.1 普通进程

普通进程的生命周期与会话绑定。它们在我们运行命令时启动,并在完成任务或会话结束时(如注销登录)终止。这些进程可由系统中的任何有效用户(包括 root 用户)拥有。

比如: 当我们运行简单的命令如ls -lagrep "error" logfile.txt时,这些都是在活动会话中启动、执行并结束的普通进程。

实际场景: 假设我们正在使用以下命令将一个大视频文件从一个目录复制到另一个目录:

cp large_movie.mp4 /backup/

如果在复制操作过程中断开 SSH 连接,该进程会立即被终止,复制操作也会中途停止。这是因为终端关闭时进程接收到了SIGHUP信号。

1.2 孤儿进程

孤儿进程是指那些最初有父进程,但当其父进程意外死亡或崩溃时变得”无父”的进程。

当这种情况发生时,init进程(PID 1)或现代系统中的systemd会自动收养这些孤儿进程作为其新的父进程。随后,init会等待这些进程自然完成或终止。

比如: 假设我们编写了一个名为backup.sh的备份脚本,该脚本会生成多个子进程:

#!/bin/bash
# 主备份脚本
tar -czf backup1.tar.gz /data/folder1 &
tar -czf backup2.tar.gz /data/folder2 &
tar -czf backup3.tar.gz /data/folder3 &
wait

如果主备份脚本backup.sh意外崩溃或被终止(可能是由于内存问题),那三个 tar 压缩任务仍在运行。

它们会成为孤儿进程,而init会自动成为它们的父进程,允许它们继续运行直至完成。

我们可以通过检查父进程ID(PPID)来验证这一点:

ps -ef | grep tar
# 会看到 PPID = 1(init/systemd)

1.3 守护进程

守护进程是特意设计的孤儿进程,旨在在后台持续运行。它们被刻意与任何控制终端分离,以便能够独立于用户会话运行。

父进程在生成守护进程后有意退出,使init/systemd成为其父进程。

常见的守护进程包括

  • Web 服务器: Apache(httpd)或 Nginx(nginx)持续在后台运行,监听 80/443 端口上的传入 HTTP 请求
  • 数据库服务器: MySQL(mysqld)或 PostgreSQL(postgres)保持运行以处理数据库查询
  • SSH 守护进程: sshd 进程本身始终在后台运行,等待传入的 SSH 连接

例如,当我们启动nginx时:

systemctl start nginx

主 Apache 进程生成后,会从终端分离,并持续运行,即使我们注销登录。它成为一个以init/systemd为父进程的守护进程:

ps -ef | grep nginx
root      36568      1  0 14:37 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     36569  36568  0 14:37 ?        00:00:00 nginx: worker process
nginx     36570  36568  0 14:37 ?        00:00:00 nginx: worker process
nginx     36571  36568  0 14:37 ?        00:00:00 nginx: worker process
nginx     36572  36568  0 14:37 ?        00:00:00 nginx: worker process
root      36588  33960  0 14:37 pts/0    00:00:00 grep --color=auto nginx

2.实际应用场景

了解这些进程类型后,我们可以根据实际需求选择最合适的方法来保持 SSH 会话:

2.1 screen 工具 – 会话管理专家

适用场景: 需要完整终端会话的交互式工作,如长时间编译、文本编辑等

优势: 可恢复的完整工作环境,支持多个窗口,操作直观

实例:数据库备份和恢复操作

(1)创建备份会话

切换到oracle用户,创建会话,会话名为oraclebackup

[oracle@mydb~]$ screen -S oraclebackup

(2)执行备份任务

在刚才新建的oraclebackup会话中执行备份任务:

[oracle@mydb~]$ expdp imoon/imoon@testdb:1521/imoon DIRECTORY=myexpdir DUMPFILE=orac19c_20260130.dmp logfile=oracl19c_20260130.log schemas=imoon

(3)分离会话

这里先按Ctrl+A,然后按D键,分离会话,或者直接从终端退出(这在实际更为常用,由于某种原因终端 SSH 连接突然断了):

这时会话会继续在后台运行备份任务。

(4)列出所有会话

再次登录终端,执行下面命令查看所有会话:

[oracle@mydb~]$  screen -ls
There is a screen on:
 1674.oraclebackup (Detached)
1 Socket in /var/run/screen/S-oracle.

[oracle@mydb~]$ 

(5)恢复会话

执行screen -r session_name命令,恢复终端连接的会话:

[oracle@mydb~]$  screen -r oraclebackup

执行后,看到如下备份结果:

……
. . exported "IMOON"."ALO_LEASE_OUT"                        0 KB       0 rows
. . exported "IMOON"."ALO_LEASE_OUT_B"                      0 KB       0 rows
. . exported "IMOON"."PUB_WORKINGTASKLOG"               6.012 GB 1175022 rows
Master table "IMOON"."SYS_EXPORT_SCHEMA_10" successfully loaded/unloaded
******************************************************************************
Dump file set for IMOON.SYS_EXPORT_SCHEMA_10 is:
  /data/mybak20251224/orac19c_2026013.dmp
Job "IMOON"."SYS_EXPORT_SCHEMA_10" successfully completed at Fri Jan 30 15:20:09 2026 elapsed 0 00:17:50

[oracle@mydb~]$ 

2.2 tmux 工具 – 现代化终端复用器

适用场景: 复杂的工作流,需要分割窗口、面板管理等高级功能

优势: 强大的窗口管理,可定制性强,社区活跃

实例:将备份后的文件复制到另一台主机

(1)创建 tmux 会话

创建名为”backup”的 tmux 会话:

[oracle@mydb mybak20251224]$ tmux new -s backup
[detached]

(2)在 tmux 中执行 rsync 命令:

[oracle@mydb mybak20251224]$ rsync -avzP --delete --progress 20260130 192.168.38.72:/oradata/mydump/
The authenticity of host '192.168.38.72 (192.168.38.72)' can't be established.
ECDSA key fingerprint is SHA256:sRkea2xlJmVgNQNSk2RcDXzwRXizb7H5ruc5SKdAtqg.
ECDSA key fingerprint is MD5:b9:0a:6b:3e:7c:87:f0:37:a7:8e:f0:76:49:31:4c:27.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.38.72' (ECDSA) to the list of known hosts.
oracle@192.168.38.72's password: 
sending incremental file list
20260130/
20260130/kzbd_20260130.log
        653,163 100%   15.99MB/s    0:00:00 (xfr#1, to-chk=4/6)
20260130/kzbd_20260130_01.dmp
    406,880,256   3%   29.05MB/s    0:05:53  


[backup] 0:oracle@mydb:/data/mybak20251224*                                              "mydb" 15:54 30-Jan-26

(3)分离会话

分离 tmux 会话,保持后台运行,先按Ctrl+B然后按 D

[oracle@mydb mybak20251224]$ 

这时回到命令窗口,看不到同步进度。

(4)查看所有 tmux 会话

[oracle@mydb mybak20251224]$ tmux ls
backup: 1 windows (created Fri Jan 30 15:51:59 2026) [113x20]
[oracle@mydb mybak20251224]$ 

(5)恢复会话

[oracle@mydb mybak20251224]$ tmux attach -t backup

此时,回到之前的进度显示状态。

2.3 nohup 命令 – 简单后台任务

适用场景: 简单的非交互式任务,如脚本执行、文件处理

优势: 使用简单,无需额外安装软件

nohup ./long_running_script.sh > output.log 2>&1 &

2.4 disown 命令 – 将已有任务后台化

disown 的作用:将已经放入后台的作业从 Shell 作业表中移除,使其成为”孤儿进程”,从而在退出 Shell 时不会收到 SIGHUP 信号而终止。

关键特点:

  • 只能处理当前Shell的作业;
  • 作业必须先放入后台(使用 & 或 Ctrl+Z  +  bg );
  • 操作后无法再用 fg / bg 控制;
  • 进程继续运行,init/systemd自动接管。

2.5. setsid 命令 – 创建独立会话

适用场景: 需要完全独立的会话环境

主要特点:

  • 新会话:setsid创建的新会话完全独立于调用它的终端或会话。
  • 进程组领头:调用setsid的进程成为新会话和新进程组的领头进程。
  • 脱离终端:新会话中的进程不再受终端信号(如挂起信号)的影响。
  • 重定向标准流:虽然setsid不直接重定向标准输入、输出和错误输出,但用户可以通过重定向来实现。

举例:在后台运行命令

这个命令会在后台启动一个 ping 进程,即使关闭终端,ping 进程也会继续运行。

setsid ping mybj123.com

但是该命令也回不到前台,只能查到输出:

ps aux | grep ping
root       6429  0.0  0.0 463588  4176 ?        Sl   1 月 22   1:05 /usr/libexec/gsd-housekeeping
root      42991  0.0  0.0 150088  1996 ?        Ss   16:27   0:00 ping www.mybj123.com
root      43154  0.0  0.0 112828   976 pts/1    S+   16:29   0:00 grep --color=auto ping
[root@zccdb81 ~]# pgrep -f "ping mybj123.com"

以上关于怎么保持SSH会话在断开连接后持续运行?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 怎么保持SSH会话在断开连接后持续运行?

发表回复