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

AI 概述
SSH断开时,系统会向伪终端发SIGHUP信号终止进程。Linux进程类型中,守护进程是希望在SSH断开后保持的状态。有五种保持SSH会话运行的技术:screen和tmux适合多任务管理;nohup适合简单后台任务;disown可处理已运行作业;setsid隔离性最好。日常运维推荐用tmux或screen,简单脚本任务用nohup或setsid,紧急情况用disown,生产环境考虑专业工具。使用时要注意重定向输出、检查资源使用、查看进程树,关键服务建议用专业管理工具。
目录
文章目录隐藏
  1. 1.SSH 断开时进程终止的原因
  2. 2.Linux 进程类型与 SSH 会话的关系
  3. 3.五种保持 SSH 会话运行的技术
  4. 4.五种方法对比
  5. 5.实践建议
  6. 6.注意事项

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进程在断开连接后继续运行的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

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

微信微信 支付宝支付宝

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

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

发表回复