如何通过SSH启动任务并在退出终端后保持其运行?
解决SSH断开后任务持续运行的问题
我之前也碰到过一模一样的糟心事!SSH终端一关,跑了大半天的任务直接终止,白忙活一场。给你分享几个我亲测有效的方案,从简单快速到稳定进阶都有,你可以根据自己的需求选:
1. 最基础:nohup + 后台运行
这是最简单的临时解决方案,适合一次性的任务。
用法很直接:
nohup your_command &
nohup会让进程忽略终端挂起的SIGHUP信号,避免断开SSH时被终止&把任务放到后台运行- 默认情况下,任务的输出会被写到当前目录的
nohup.out文件里,你也可以手动重定向输出到指定文件:
nohup your_command > my_task.log 2>&1 &
(2>&1 是把错误输出也合并到标准输出里)
注意:执行完后别直接关掉终端窗口,最好输入 exit 或者 logout 正常退出,有些终端直接关闭还是会发送额外信号导致进程终止。
2. 会话持久化:screen
如果需要后续重新连接服务器,继续查看任务的输出或者操作,screen 是绝佳选择——它能创建一个独立于终端的会话,即使SSH断开,会话里的进程依然在跑。
步骤:
- 先安装screen(大部分服务器默认已装,没有的话):
# Debian/Ubuntu sudo apt install screen # RHEL/CentOS sudo yum install screen - 启动一个新会话:
screen - 在新会话里运行你的任务,比如
python my_long_task.py - 按下
Ctrl+A然后松开,再按D,就能** detach(分离)**当前会话,回到原来的终端 - 现在断开SSH也没关系,任务一直在跑。下次重新连接服务器后,用下面的命令回到会话:
如果有多个screen会话,先列出所有会话:screen -r
然后用会话ID或名字重新连接:screen -lsscreen -r 12345
3. 更强大的会话管理:tmux
tmux 是screen的进阶版,功能更丰富(比如分屏、会话共享等),现在越来越多人用它替代screen。
步骤类似:
- 安装tmux:
# Debian/Ubuntu sudo apt install tmux # RHEL/CentOS sudo yum install tmux - 启动新会话:
tmux - 运行任务后,按下
Ctrl+B然后松开,再按D分离会话 - 重新连接会话:
列出会话:tmux attachtmux ls,指定会话连接:tmux attach -t my_session(如果给会话起了名字的话)
4. 稳定长期运行:Systemd 服务
如果你的任务需要长期稳定运行,甚至开机自动重启,那用Systemd服务是最靠谱的方式——这是Linux系统原生的服务管理工具,能帮你监控进程,崩溃了自动重启,还能管理日志。
步骤:
- 创建一个Systemd服务文件,比如
/etc/systemd/system/my-long-task.service(需要sudo权限):[Unit] Description=我的长期运行任务 After=network.target # 如果任务依赖网络,加上这个 [Service] User=your_username # 替换成你的用户名,避免用root运行 ExecStart=/path/to/your/command # 替换成你的任务命令的绝对路径 Restart=always # 进程意外终止时自动重启 RestartSec=5 # 重启间隔5秒 StandardOutput=journal+console # 输出到系统日志 StandardError=journal+console [Install] WantedBy=multi-user.target # 多用户模式下开机启动 - 重新加载Systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start my-long-task - 查看服务状态:
sudo systemctl status my-long-task - 设置开机自启(可选):
sudo systemctl enable my-long-task - 查看任务日志:
journalctl -u my-long-task -f # -f 实时查看日志
常见坑点排查
如果你之前试过方法没用,可能是这些原因:
- 任务本身需要终端交互(比如需要输入密码):这种情况
nohup会失效,必须用screen/tmux或者把交互改成非交互式(比如配置免密) - 直接关闭终端窗口而不是正常
exit:有些终端模拟器关闭时会发送SIGTERM信号,nohup只能处理SIGHUP,所以最好正常退出终端 - 进程因为其他错误终止:比如内存不足、依赖缺失,这种情况用Systemd的话能看到日志,方便排查
内容的提问来源于stack exchange,提问作者Johannes Lemonde




