当前位置:首页>Linux>在Linux中如何让远程SSH进程在断开连接后继续运行

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

  • 2026-10-23 23:06:06
在Linux中如何让远程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断开后关键任务持续运行,避免因网络波动或客户端问题导致工作中断。

最新文章

随机文章