You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SSH退出后Bash中的后台进程仍能持续运行?

为何SSH/Bash退出后后台进程无需nohup/tmux也能稳定运行?

这和普遍认知完全相反!我按以下操作执行时,不用nohup、tmux这类工具,退出SSH/Bash后后台进程也能一直稳定运行,想知道Linux下这一现象的原因。

操作步骤:登录SSH启动后台进程后退出

ssh me@myserver
me@myserver> python long_running_script.py &
[1] 123456
me@myserver> exit
logout
Connection to myserver closed.

重新登录后进程仍在运行

ssh me@myserver
me@myserver> ps -aux | grep long_running_script
me  123456  22  0.2 71501234 1234152 ?  R1   22:22  22:36 python long_running_script.py

注:这是我预期的结果,并非寻求解决方案。我想明白为何在Linux上总能实现这种效果,而常规认知是SSH退出后后台进程会被终止。
注:该现象和脚本类型无关,Shell脚本及Linux命令(如sleep 1000 &)都是如此。


核心原因:Bash默认不向后台进程发送SIGHUP信号

常规认知里“SSH退出后后台进程会终止”,本质是会话领头进程退出时,会向同会话的子进程发送SIGHUP信号,而大多数进程收到SIGHUP后会默认终止。但你的场景中,这种信号并没有被发送,原因在于:

  1. Bash的huponexit选项默认关闭
    Bash有个内置选项huponexit,专门控制退出交互式Shell时是否向后台进程发送SIGHUP。默认情况下这个选项是关闭的(可以用shopt huponexit查看状态),所以当你执行exit退出SSH会话的主Bash时,它不会给后台运行的子进程(比如你启动的Python脚本、sleep命令)发送SIGHUP,进程自然会继续运行。

  2. 进程未因终端访问触发终止信号
    即使进程属于原SSH会话的终端组,只要它不需要和终端交互(比如你的脚本没有输入输出需求),就不会触发SIGTTIN/SIGTTOU这类会导致进程暂停或终止的信号。这类信号只有当后台进程尝试读取/写入控制终端时才会被发送,而无终端交互需求的后台进程完全不受影响。

为何会有“后台进程会终止”的常规认知?

这个误区主要来自几个场景:

  • 部分其他Shell(比如Zsh)默认会在退出时向后台进程发送SIGHUP;
  • 早期Bash版本或特定配置中huponexit被手动开启;
  • 当用户用Ctrl+C终止前台进程后直接退出,或者进程本身依赖终端输入输出,会触发相关终止信号。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:52:17