首页/系统/Linux 运维命令速查/场景:终端断开后任务还在吗
进程与作业69 条

场景:终端断开后任务还在吗

SSH 断线后任务命运由信号决定:前台任务会被 HUP 干掉,nohup/disown/setsid/tmux 的才能活;事后补救先查进程还在不在。

Linux 运维命令速查系统更新于 2026-10-13

断线后任务还在吗

SSH 断线后任务是否活着,取决于它的会话与控制终端状态:前台任务会随终端关闭收到挂断信号而终止,只有在启动时或启动后做了脱离处理的任务才能继续跑。判断方法很直接,看进程是否还在、TTY 是否变成问号;预防方法也很固定,用可重连的会话或彻底脱离终端的启动方式。

基本信息

典型场景网络抖动、笔记本休眠、误关终端后担心任务被中断
确认手段pgrep 按命令行查找,ps 看 TTY 与运行时长
防断手段tmux / screen、nohup、setsid、disown、systemd 服务
常见误区把「还在 ps 里」等同于「任务正常」,实际进程可能已卡在写日志上

排查与预防要点

  • 先确认进程是否仍存在,再看其 TTY 是不是问号,判断是否有控制终端
  • 看日志尾部有没有挂断痕迹与半成品文件,决定是继续等待还是重跑
  • 重跑前清理上次留下的锁文件与临时文件,否则新任务可能直接卡住
  • 有交互或需要观察过程的任务,直接进 tmux 再执行,最省心
  • 无人值守的生产任务用 systemd 服务托管,别依赖终端技巧

确认存活

确认存活
pgrep -af 'worker.sh'                 # 按命令行找进程,含 PID 与完整命令
ps -o pid,stat,tty,etime,cmd -p 1234  # TTY 为 ? 表示已脱离终端
ps -o etime= -p 1234                  # 运行时长,用来判断是否被重启过
tail -n 20 /var/log/worker.log        # 看日志尾部是否停在断连时刻
grep -iE 'hangup|broken pipe' /var/log/worker.log | tail

下次防断

下次防断
ssh -t ops@host 'tmux new -s job'                            # 进 tmux 再跑,可随时重连
ssh ops@host 'nohup setsid ./job.sh </dev/null >/tmp/job.log 2>&1 &'   # 一次性脱离终端
systemd-run --unit=myjob --collect ./job.sh                  # systemd 托管,日志进 journal
journalctl -u myjob -f                                       # 不受终端影响地跟踪日志

做法与断线表现

做法启动时机断线后表现
直接前台运行—收到挂断信号,通常立即终止
cmd & 后台运行启动时多数情况下仍会随终端关闭被挂断
nohup cmd &启动时忽略挂断信号,继续运行但输出需重定向
disown启动之后脱离作业表,退出终端不再打扰它
tmux / screen启动时会话独立于 SSH,重连后可继续交互
systemd 服务部署时由 init 托管,重启与日志都有保障
网络抖动频繁时,客户端可以用 ServerAliveInterval 保活,服务端有 ClientAliveInterval 控制探测;这两项只能减少断连,不能替代任务脱离处理。

易错点

  • 断线前没做防护的任务大概率已经死了,先看日志尾部有没有挂断痕迹再决定重跑
  • 重跑前不清理残留的半成品文件与锁,新任务会卡在等待锁上
  • 以为进程还在就没问题:它可能正因终端消失而写入失败,检查日志是否停滞
  • 用 & 放进后台并不等于脱离终端,误以为高枕无忧,结果断线即挂

数据来源与参考

  • man 1 ssh(OpenSSH 手册)
  • man 1 tmux

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌