faq_2026-09-28_st_4


title: “SSH断开后服务器上正在跑的任务为什么就没了” description: “SSH 窗口一关或网络一断,服务器上跑着的同步、备份任务就跟着停了。这不是服务器不稳定,而是挂断信号按章办事:终端会话结束时会把 SIGHUP 送给其上运行的进程。本文讲清信号机制、nohup 加后台加重定向三件套各自的分工,以及更稳的会话保持与调度层方案。” slug: ssh-disconnect-background-task-stops date: 2026-09-28 categories: [“常见问答”] draft: false

在 SSH 窗口里挂了个数据同步任务,跑了两小时眼看要收尾,网络抖了一下,重连上去一看:任务没了,输出文件断在半截。换台电脑、换个时段照样复现,像服务器专门跟长任务过不去。真相是——断开连带你跑的任务,是信号机制的本职工作。

原因分析

任务是从你的登录会话里启动的,父子关系一直牵着。SSH 断开时,远端会把终端挂断这件事通知出去,挂断信号(SIGHUP,名字来自电话挂断的年代)会送给这个终端上的会话首进程,再扩散到前台进程组,默认规则是收到即退出。你的任务没做错任何事,它只是恰好挂在这条会话上,会话散了它跟着散。

所以关键不是「为什么断」,而是「怎么让任务与会话脱钩」。常被混为一谈的几件事各有分工:nohup 只挡住挂断信号这一路;后台符号把任务挪出前台;输出重定向把任务与终端的通道剪断。只做其一都可能没脱干净——只挡信号不转输出,终端关闭时仍可能被输出通道拖住;只放后台不挡信号,断开照旧可能带走它。三件事合起来,才叫真正的脱离。

分步解决

  1. 临时任务用三件套起手。nohup 你的命令 > 运行日志 2>&1 & ——挡信号、进后台、转输出一次到位。写完看一眼日志文件开始增长,再关窗口心里才有底。
  2. 退出前确认脱离干净。exit 前用 jobs 看任务还在清单里,必要时 disown 把作业从当前 shell 摘出去,然后安心断开,回头用进程号验活。
  3. 要看实时输出的,换会话保持工具。tmux 一类终端复用器把任务放进独立会话,断线重连后接回原会话,输出与交互都在——比 nohup 多了「回得去」这一手。
  4. 周期任务交给调度层。每晚备份、定时同步这类活,写进计划任务或系统定时器,从一开始就不依赖任何登录会话,窗口只留给观察。
  5. 已经断掉的别硬找。被带走的任务不会回来,重点转向断点续跑:对照日志断在哪里与目标位置,用支持续传的工具从断点接着来,别盲目从头重跑。
  6. 验活看硬指标。ps 查进程号还在不在,或看输出文件的修改时间是否持续更新,以这个为准判断任务真活着。

预防

给长任务立规矩:一次性的进 tmux,周期性的进调度,登录窗口永远只当观察窗用。贵州诚鑫致达科技给客户搭备份体系时,夜间接力的任务全部落在调度层而非任何人的终端里——任务活不活,从此跟某个人某晚有没有掉线无关。