0

0

Python Supervisor vs tini vs dumb-init

冷漠man

冷漠man

发布时间:2026-02-21 12:39:09

|

130人浏览过

|

来源于php中文网

原创

supervisor 默认不转发 sigterm 到孙子进程,需设 killasgroup=true 和 stopasgroup=true;tini 是轻量 pid 1 init,负责信号透传与僵尸回收;python 自行处理信号无法覆盖整个进程树,必须依赖 tini 或 dumb-init。

python supervisor vs tini vs dumb-init

supervisor 启动进程后收不到 SIGTERM?

因为 supervisor 默认不把信号转发给子进程的子进程(即孙子进程),只发给直接子进程。你用 supervisord 跑一个 shell 脚本,脚本再启动 python app.py,那 kill -TERM 只会到 shell,不会透传到 Python 进程——结果就是容器停不干净,超时被强制 kill。

实操建议:

笔尖Ai写作
笔尖Ai写作

AI智能写作,1000+写作模板,轻松原创,拒绝写作焦虑!一款在线Ai写作生成器

下载
  • supervisord.conf 中为每个 program 设置 killasgroup=truestopasgroup=true,强制按进程组发信号
  • 避免用 shell=True 或写 command=/bin/sh -c "python app.py",改用直接执行:command=python app.py
  • 如果必须用 shell 封装,加 startsecs=0 + autorestart=false 防止异常重启掩盖问题

tini 是什么,为什么 Docker 官方镜像里总带它?

tini 不是进程管理器,是个极简 init 系统(PID 1),唯一任务:当主进程退出时,收掉所有孤儿进程;同时把收到的信号(比如 SIGTERM)原样转发给子进程——这正是容器里缺失的关键链路。

常见错误现象:没加 tini 的镜像,Python 进程 fork 出子进程(如多进程日志轮转、multiprocessing.Pool),主进程一停,子进程变僵尸或继续跑,docker stop 卡住。

立即学习Python免费学习笔记(深入)”;

实操建议:

  • Dockerfile 里加 ENTRYPOINT ["/sbin/tini", "--"],再接你的主命令,比如 ["/sbin/tini", "--", "python", "app.py"]
  • 别用 tini -v 或带多余参数,Docker 1.13+ 自带 tini,可用 ENTRYPOINT ["tini", "--"] 直接调用
  • 确认你的 Python 进程没忽略 SIGTERM:检查是否调用了 signal.signal(signal.SIGTERM, ...) 但没做清理就 exit

dumb-init 和 tini 有啥区别?能随便换吗?

两者定位完全一致:轻量 PID 1 init,解决信号转发和僵尸回收。区别在于实现和默认行为:dumb-init 默认开启 --rewrite(重写进程名),tini 更保守,纯转发。

使用场景差异:

  • 如果你的 Python 日志里看到进程名全是 tinidumb-init,影响排查,选 tini(不重写)或 dumb-init --no-rewrite
  • dumb-initSIGHUP 默认转成 SIGTERMtini 不做任何转换——如果你依赖 SIGHUP 触发 reload,别用 dumb-init 默认配置
  • 镜像体积上,tini 静态链接二进制更小(~60KB),dumb-init 稍大(~120KB),但差别不大

Python 进程里自己处理信号够不够?

不够。即使你在 Python 里写了 signal.signal(signal.SIGTERM, cleanup),也只管得了自己的进程。fork 出来的子进程、subprocess.Popen 启的外部命令、C 扩展里创建的线程,都不会自动继承这个 handler。

更麻烦的是:容器里 PID 1 没有 init 功能,子进程 exit 后没人 wait,变成僵尸;SIGTERM 到不了子进程,它们卡在 running 状态。

所以关键点不是“Python 能不能响应信号”,而是“整个进程树能不能被干净终止”。这时候靠 tinidumb-init 做 PID 1,比在 Python 里堆 signal 处理逻辑更可靠。

容易被忽略的地方:很多人加了 tini,但 Python 主进程又用 os.execv 替换了自身,导致 tini 失去对后续进程的控制——这种情况下,tini 已经退出,后面全是裸奔进程。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

421

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

594

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

695

2023.08.10

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

265

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

512

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

447

2024.04.08

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

18

2026.02.11

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号