断开SSH连接程序会被终止吗?SSH连接断开时程序是否会终止?

你熬了三天写的Python脚本,在服务器上跑了18小时马上出结果——突然网络抽风SSH断开!再连回去发现程序早凉透了...​​这种痛我懂​​!今天咱们就彻底搞明白:为什么SSH一断程序就挂?怎么让它后台苟住?别信什么"nohup万能论",有些坑掉进去能让你加班到天亮。


一、​​血泪真相:SSH断开≈程序 *** 刑​

刚学Linux的小白总以为:"我在服务器跑程序,关我电脑有啥关系?" ​​关系大了去了!​​ 当你SSH连服务器时,其实建了个"家族关系链":

  • SSH爸爸(会话首进程)
  • Bash儿子(你打开的终端)
  • 程序孙子(你运行的脚本)
    ​一旦你断开SSH​​:
  1. 系统给SSH爸爸发​​SIGHUP *** 刑信号​
  2. SSH爸爸被干掉
  3. 全家连坐:Bash儿子和程序孙子全被处决

真实案例:某程序员训练AI模型时接了个电话,WiFi休眠导致SSH断开,37小时训练白费


二、​​为什么我用了&后台运行还是挂?​

断开SSH连接程序会被终止吗?SSH连接断开时程序是否会终止?  第1张

很多人以为命令后加&就高枕无忧:

复制
python train.py &  # 后台运行总安全了吧?  

​错!这只能防终端关闭,防不了SSH断开!​
根本原因:​​&只是让程序不占终端,但没脱离"家族链"​

​操作​​防终端关闭​​防SSH断开​
命令后加 &✅ 是❌ 否
nohup命令✅ 是✅ 是
screen会话✅ 是✅ 是

三、​​保命三招:总有一款适合你​

▍ 方案1:nohup——简单粗暴型

适用场景:​​只需记录日志的程序​​(比如数据备份)

复制
nohup python train.py > log.txt 2>&1 &  

​优点​​:

  • 任何SSH断开都不怕
  • 输出自动存log.txt
    ​致命缺陷​​:
  • 无法交互(不能输命令调参数)
  • 想实时看进度?没门!

▍ 方案2:screen——灵活复用型

适用场景:​​需要随时查看进度的任务​​(比如模型训练)
操作步骤:

  1. 连接服务器装screen:sudo apt install screen
  2. 创建新会话:screen -S my_train(给会话起名)
  3. 在会话中运行程序:python train.py
  4. 按​​Ctrl+A 再按D​​脱离会话(程序在后台跑)
  5. 下班回家重连后:screen -r my_train满血复活
    ​比nohup强在哪​​:
  • 随时切回界面看实时输出
  • 能运行需要交互的命令(比如调试脚本)

▍ 方案3:byobu——土豪尊享型

适用场景:​​同时跑多个任务的小团队​

复制
sudo apt install byobu  # 安装byobu                  # 进入  

​凭什么比screen贵​​:

  • 分屏操作:左边看日志,右边调代码
  • 状态栏监控:实时显示CPU/内存占用
  • 会话共享:同事也能接入你的会话协作

四、​​灵魂拷问:为什么系统非要杀我程序?​

Q:服务器上的程序,关我本地SSH什么事?

​A​​:Linux设计哲学——​​终端是程序的命根子​

  • 程序输出往哪显示?(靠终端)
  • 用户输入从哪读取?(靠终端)
  • 终端都没了,程序活着也是"植物人"

Q:为什么Apache/Nginx这些服务不怕SSH断开?

​A​​:人家早​​自断血脉​​了!守护进程(daemon)启动时会:

  1. 脱离终端关联
  2. 把自己过继给init进程(PID=1的祖宗进程)
  3. 关掉没用的文件描述符(包括终端)
    ​普通程序想学这招?​​ 用daemon()函数改造代码,但新手慎碰!

五、​​防翻车指南:这些骚操作别碰!​

作 *** 行为1:直接关SSH窗口

  • ​后果​​:90%概率触发SIGHUP团灭
  • ​正确姿势​​:务必用exit退出!部分系统会温柔清理

作 *** 行为2:用disown硬拆家族链

有人教你这样"保命":

复制
python train.py &  # 后台运行jobs -l            # 查任务IDdisown -h %1       # 拆血缘关系  

​翻车风险​​:

  • 程序可能变成"孤儿"失控
  • 某些依赖终端的程序直接崩溃

作 *** 行为3:云服务器强制重启

以为网页控制台重启更安全?​​大错​​!

  • 网页重启 = 直接断电
  • 未刷新的内存数据全丢
  • 机械硬盘可能磁头划 *** 盘片

小编拍桌观点

运维八年救过无数"猝 *** "的程序,最想吼醒三类人:

​第一类:佛系随缘党​
"断就断吧,大不了重跑" ——兄弟,你跑的是3小时的脚本,人家跑的是3天的模型!​​用nohup也就多敲5秒,何必赌人品?​

​第二类:屏幕永动机​
"我从不关SSH窗口" ——合着您电脑永不休眠?建议给电脑插呼吸机:)​​开个screen能累 *** ?​

​第三类:玄学选手​
"上次没加nohup也没挂" ——那叫走狗屎运!系统刚好没发SIGHUP信号。​​别拿偶然当规律,关键任务必须上保险!​

下次跑任务前,记住这个​​祖传口诀​​:

短跑任务用&,长跑必须nohup
要盯进度上screen,团队协作byobu
直接关窗是作 *** ,exit退出留全尸

要是还偷懒...下次程序暴毙别哭!