Linux中如何让远程SSH进程在断开连接后继续运行

在远程服务器运维与操作中,SSH 是极为常用的工具,借助它我们能便捷地通过命令行远程访问系统。然而,当 SSH 会话因主动退出、闲置超时等情况断开时,在会话中运行的进程往往会随之终止,这可能给工作带来极大困扰,特别是对于长时间运行或关键的任务。为解决这一问题,有多种技术手段可供选择。下面将详细介绍 SSH 断开时进程终止的原因、Linux 进程类型与 SSH 会话的关系,以及五种保持 SSH 会话运行的技术等内容来解决这一问题。
1.SSH 断开时进程终止的原因
SSH(Secure Shell)是一种通过命令行远程访问其他系统的协议。当我们通过 SSH 登录远程服务器并执行命令时,系统会创建一个伪终端(pseudo-terminal)并连接到登录 shell。
当我们主动退出会话或因闲置超时导致会话断开时,系统会向伪终端发送 SIGHUP(挂起)信号。这个信号会终止所有在该终端中运行的进程,包括那些由父进程在伪终端中启动的子进程。只有配置为忽略此信号的进程才能在会话终止后幸存。
2.Linux 进程类型与 SSH 会话的关系
(1)普通进程
普通进程的生命周期与会话绑定。它们作为前台进程在会话中启动,并在特定时间结束或随会话退出而终止。
(2) 孤儿进程
当父进程意外崩溃或终止后,其子进程会被 init 进程接管,成为孤儿进程。这些进程在后台继续运行,直到自然结束。
(3)守护进程
这是一种有意创建的孤儿进程。它们启动后便脱离控制终端,在后台长期运行,直到完成任务或出错退出。这正是我们在 SSH 断开后希望进程保持的状态。
3.五种保持 SSH 会话运行的技术
3.1 使用 screen 命令
screen 是一个文本窗口管理器,允许多终端会话管理、会话切换和随时恢复。
基本操作:
# 启动新会话 screen # 分离当前会话(快捷键 Ctrl+a d) [会话中按 Ctrl+a,然后按 d] # 重新连接会话 screen -r # 单个会话时 screen -r <pid.tty.host> # 多个会话时指定
优点: 会话可随时分离和恢复,支持多窗口管理。
3.2 使用 tmux 终端复用器
tmux 是 screen 的增强替代品,支持水平/垂直分割窗格、调整窗格大小、会话监控等高级功能。
基本操作:
# 启动新会话 tmux # 分离会话 tmux detach # 或快捷键 Ctrl+b d # 重新连接 tmux attach
优势: 功能比 screen 更强大,已成为许多 Unix 发行版的标准工具。
3.3 使用 nohup 命令
nohup 让进程忽略 SIGHUP 信号,适合不熟悉 screen/tmux 的用户。
# 在后台运行命令并忽略挂起信号 nohup find / -type f > files.out 2>&1 & # 重新登录后查看进程 jobs fg %JOBID # 将作业调至前台
注意: 输出默认重定向到 nohup.out 文件。
3.4 使用 disown 命令
disown 将作业从系统作业列表中移除,使其不会在会话断开时收到 SIGHUP 信号。
# 示例:后台运行 ping 命令 ping example.com > ping.out & jobs -l # 查看作业 ID disown -h %1 # 从作业列表移除第一个作业 # 验证进程是否仍在运行 ps -ef | grep ping
限制: 不适合需要 stdin/stdout 交互的进程,除非提前重定向输入输出。
3.5 使用 setsid 命令
setsid 为新进程分配独立的进程组,提供比 nohup 更好的隔离性。
# 在新进程组中运行命令 setsid sleep 10m # 验证进程状态 ps -ef | grep sleep
优势: 进程完全脱离控制终端,即使在同一会话中按 Ctrl+C 也不会受影响。
4.五种方法对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| screen | 需要交互的多任务管理 | 功能全面,会话可恢复 | 需要额外学习 |
| tmux | 高级终端复用需求 | 功能最强,支持窗格分割 | 配置相对复杂 |
| nohup | 简单后台任务 | 使用简单,无需额外工具 | 输出需重定向 |
| disown | 已启动任务的保持 | 可处理已在运行的作业 | 不适合交互式任务 |
| setsid | 需要完全隔离的任务 | 进程隔离性最好 | 功能相对单一 |
5.实践建议
日常运维推荐:优先使用 tmux 或 screen,特别是需要管理多个任务或长时间运行交互式进程时。
简单脚本任务:使用 nohup 或 setsid,配合输出重定向(> file 2>&1)。
紧急情况:对已运行的进程使用 disown 挽救。
生产环境:考虑使用系统服务(systemd)或进程监控工具(supervisor)进行更专业的管理。
6.注意事项
- 无论使用哪种方法,确保重要输出已重定向到文件
- 定期检查后台进程的资源使用情况
- 使用 ps auxf 查看进程树关系
[root@backup ~]# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 2025 0:02 [kthreadd] root 4 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/0:0H] root 6 0.0 0.0 0 0 ? S 2025 0:17 \_ [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/0] root 8 0.0 0.0 0 0 ? S 2025 0:00 \_ [rcu_bh] root 9 0.0 0.0 0 0 ? R 2025 2:54 \_ [rcu_sched] root 10 0.0 0.0 0 0 ? S< 2025 0:00 \_ [lru-add-drain] root 11 0.0 0.0 0 0 ? S 2025 0:18 \_ [watchdog/0] root 12 0.0 0.0 0 0 ? S 2025 0:17 \_ [watchdog/1] root 13 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/1] root 14 0.0 0.0 0 0 ? S 2025 0:00 \_ [ksoftirqd/1] root 16 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/1:0H] root 17 0.0 0.0 0 0 ? S 2025 0:17 \_ [watchdog/2] root 18 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/2] root 19 0.0 0.0 0 0 ? S 2025 0:00 \_ [ksoftirqd/2] root 21 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/2:0H] root 22 0.0 0.0 0 0 ? S 2025 0:16 \_ [watchdog/3] ……
- 对于数据库等关键服务,建议使用专业的服务管理工具
通过合理选择这些工具,你可以确保 SSH 断开后关键任务持续运行,避免因网络波动或客户端问题导致工作中断。
以上关于Linux中如何让远程SSH进程在断开连接后继续运行的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Linux中如何让远程SSH进程在断开连接后继续运行
微信
支付宝