云服务器部署任务,为什么一断开 SSH 就停了?三种方法让任务持续运行 Published on Aug 7, 2026 in 随笔 with 0 comment # 云服务器部署任务,为什么一断开 SSH 就停了?三种方法让任务持续运行 ## 问题现象 很多人在云服务器上跑任务(比如模型训练、Claude Code 的 agentic 任务、部署脚本等)时会遇到这样的情况: 本地电脑一关机,或者 SSH 连接一断开,服务器上正在跑的任务就跟着停了。 这是因为通过 SSH 连接后,你在终端里跑的命令默认是"前台进程",一旦 SSH 会话断开,系统会给这些进程发送 `SIGHUP`(挂起)信号,进程就被杀掉了。 好在解决方法并不复杂,根据任务类型选择合适的方式即可。 ## 方法一:tmux(推荐,可随时重连查看进度) `tmux` 是一个终端复用工具,可以创建一个独立于 SSH 连接的"虚拟终端会话"。即使你断开连接,这个会话依然在服务器上运行,下次登录还能接着看。 ### 基本用法 ```bash # 如果没安装,先安装 sudo apt install tmux -y # 新建一个命名会话,比如叫 mytask tmux new -s mytask ``` 进入后会看到底部多了一条状态栏(通常显示 `[mytask]`),说明已经在 tmux 会话里了。 如果需要直接在某个具体目录下开始工作,可以在新建时用 `-c` 参数指定目录: ```bash tmux new -s mytask -c /你的/具体/目录 ``` ### 在会话里正常运行任务 ```bash cd /你的/具体/目录 python train.py ``` ### 退出但不中断任务(detach) ``` Ctrl + B,松开后按 D ``` 这样会回到普通终端,任务在后台继续跑。 ### 重新连接查看 下次登录服务器后: ```bash tmux ls # 查看有哪些会话在运行 tmux attach -t mytask # 重新连接到指定会话 ``` ### 常见报错处理 **报错一:`sessions should be nested with care, unset $TMUX to force`** 说明你当前已经身处某个 tmux 会话里了,系统不允许嵌套打开新会话。先退出当前会话(`Ctrl+B` 然后 `D`),回到最外层终端后再执行 `tmux attach`。 **报错二:`no sessions` 或 `no server running`** 说明目标会话根本不存在,可能之前没建成功,或者已经被关闭。这时候没有别的办法,只能重新用 `tmux new -s mytask` 建一个新的,并重新开始任务。 ## 方法二:nohup(简单,适合跑一次就不用管的任务) 如果任务不需要频繁查看交互过程,`nohup` 更省事: ```bash nohup python train.py > output.log 2>&1 & ``` - `nohup`:让进程忽略挂起信号,SSH 断开也不会被杀 - `> output.log 2>&1`:把标准输出和错误输出都重定向到日志文件 - 末尾的 `&`:让命令在后台运行 查看运行日志: ```bash tail -f output.log ``` ## 方法三:systemd(适合长期运行、需要自动重启的服务) 如果任务是一个需要长期在服务器上运行的服务(比如后端接口、常驻脚本),建议直接注册为系统服务,这样断线不影响,服务器重启也能自动拉起。 创建服务文件 `/etc/systemd/system/mytask.service`: ```ini [Unit] Description=My Task [Service] ExecStart=/usr/bin/python3 /home/user/train.py WorkingDirectory=/home/user Restart=on-failure User=youruser [Install] WantedBy=multi-user.target ``` 启用并启动: ```bash sudo systemctl daemon-reload sudo systemctl start mytask sudo systemctl enable mytask # 开机自启 ``` ## 三种方法怎么选 | 场景 | 推荐方法 | |---|---| | 需要随时重连查看实时输出、交互操作 | tmux | | 一次性任务,跑完就行,不用交互 | nohup | | 长期服务,需要开机自启、崩溃自动重启 | systemd | ## 小结 SSH 断开导致任务中止,本质是前台进程收到挂起信号被杀掉。只要把任务放进 `tmux` 会话、用 `nohup` 丢到后台,或者注册成 `systemd` 服务,就能让任务脱离 SSH 连接的生命周期,实现真正的"断线不断任务"。 本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。