You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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断开,会话里的进程依然在跑。

步骤:

  1. 先安装screen(大部分服务器默认已装,没有的话):
    # Debian/Ubuntu
    sudo apt install screen
    # RHEL/CentOS
    sudo yum install screen
    
  2. 启动一个新会话:
    screen
    
  3. 在新会话里运行你的任务,比如 python my_long_task.py
  4. 按下 Ctrl+A 然后松开,再按 D,就能** detach(分离)**当前会话,回到原来的终端
  5. 现在断开SSH也没关系,任务一直在跑。下次重新连接服务器后,用下面的命令回到会话:
    screen -r
    
    如果有多个screen会话,先列出所有会话:
    screen -ls
    
    然后用会话ID或名字重新连接:screen -r 12345

3. 更强大的会话管理:tmux

tmuxscreen的进阶版,功能更丰富(比如分屏、会话共享等),现在越来越多人用它替代screen。

步骤类似:

  1. 安装tmux:
    # Debian/Ubuntu
    sudo apt install tmux
    # RHEL/CentOS
    sudo yum install tmux
    
  2. 启动新会话:
    tmux
    
  3. 运行任务后,按下 Ctrl+B 然后松开,再按 D 分离会话
  4. 重新连接会话:
    tmux attach
    
    列出会话:tmux ls,指定会话连接:tmux attach -t my_session(如果给会话起了名字的话)

4. 稳定长期运行:Systemd 服务

如果你的任务需要长期稳定运行,甚至开机自动重启,那用Systemd服务是最靠谱的方式——这是Linux系统原生的服务管理工具,能帮你监控进程,崩溃了自动重启,还能管理日志。

步骤:

  1. 创建一个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  # 多用户模式下开机启动
    
  2. 重新加载Systemd配置:
    sudo systemctl daemon-reload
    
  3. 启动服务:
    sudo systemctl start my-long-task
    
  4. 查看服务状态:
    sudo systemctl status my-long-task
    
  5. 设置开机自启(可选):
    sudo systemctl enable my-long-task
    
  6. 查看任务日志:
    journalctl -u my-long-task -f  # -f 实时查看日志
    

常见坑点排查

如果你之前试过方法没用,可能是这些原因:

  • 任务本身需要终端交互(比如需要输入密码):这种情况nohup会失效,必须用screen/tmux或者把交互改成非交互式(比如配置免密)
  • 直接关闭终端窗口而不是正常exit:有些终端模拟器关闭时会发送SIGTERM信号,nohup只能处理SIGHUP,所以最好正常退出终端
  • 进程因为其他错误终止:比如内存不足、依赖缺失,这种情况用Systemd的话能看到日志,方便排查

内容的提问来源于stack exchange,提问作者Johannes Lemonde

火山引擎 最新活动