断线后任务还在吗
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 控制探测;这两项只能减少断连,不能替代任务脱离处理。