ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

tini参数选项完全清单:-v -s -g -e -p -w 6大核心参数详解

2026/9/19 8:58:19 拓冰建站 浏览量
tini参数选项完全清单:-v -s -g -e -p -w 6大核心参数详解 tini参数选项完全清单-v -s -g -e -p -w 6大核心参数详解【免费下载链接】tiniA tiny but valid init for containers项目地址: https://gitcode.com/gh_mirrors/ti/tinitini 是一款专为容器设计的轻量级 init 进程PID 1它的核心职责只有一个托管你启动的程序负责回收僵尸进程并正确转发信号。对新手来说tini 的全部玩法就浓缩在 6 个参数选项里——-v、-s、-g、-e、-p、-w。本文带你逐一看懂 tini 参数选项让你 5 分钟掌握这个容器 init 工具的正确打开方式 为什么容器需要 tini 这样的 init 进程直接让业务进程当 PID 1 会有两个经典问题僵尸进程堆积容器里产生的僵尸进程无人回收时间一长会耗尽 PID 资源信号转发失效SIGTERM等默认信号处理在 PID 1 上不会生效导致docker stop时进程杀不死。tini 用约 10KB 的极小体积解决了这两个问题它先fork出你的程序然后不断回收僵尸、把收到的信号转发给子进程并在子进程退出后以相同退出码退出。使用 Docker 时docker run --init本质上就是用 tini 这类 init 进程来托管你的容器。6 大核心参数速查表参数作用等价环境变量典型场景-v提高日志详细度最多重复 3 次TINI_VERBOSITY调试问题-s注册为子进程 subreaperTINI_SUBREAPER非 PID 1 运行时回收僵尸-g向子进程组发送信号TINI_KILL_PROCESS_GROUPCtrl-C 要一击必杀整个进程树-e把指定退出码重映射为 0可重复无修复 Java 等程序的非零退出码-p父进程退出时触发指定信号无父进程异常退出时自杀-w回收僵尸进程时打印警告无排查僵尸进程来源参数解析逻辑位于 src/tini.c完整选项字符串定义在 src/tini.c。参数一-v 调整日志详细度默认情况下 tini 只输出警告WARN级别日志。加上-v可以逐级提升详细度最多重复 3 次-vvv分别对应 INFO、DEBUG、TRACE 级别-v看到子进程启动、退出码等 INFO 信息-vv额外看到信号转发、进程回收等 DEBUG 细节-vvv连sigtimedwait这类 TRACE 级循环日志都会打印。也可以用环境变量TINI_VERBOSITY设置初始详细度默认值定义在 src/tini.c。当某次容器行为不符合预期时先-v一遍再复现是排查 tini 问题的第一步 ️参数二-s 注册为进程 subreapertini 回收僵尸进程的前提是僵尸要能重新挂靠到它身上。通常这靠运行在 PID 1 位置实现但如果你无法让 tini 当 PID 1例如套在另一层启动脚本外面就需要-s参数传递-s如tini -s -- ...或设置环境变量TINI_SUBREAPER变量名定义见 src/tini.c。两种方式都是调用prctl(PR_SET_CHILD_SUBREAPER)把自己注册为子进程 subreaper要求 Linux 内核 3.4注册逻辑见 src/tini.c。 小贴士如果 tini 既不是 PID 1 又没注册 subreaper启动时会打印一条 Zombie processes will not be re-parented to Tini 的警告没看到警告说明你的配置没问题。参数三-g 向子进程组发送信号默认情况下 tini 只把信号转发给它的直接子进程。这在某些场景下不够用docker run --rm --entrypoint tini krallin/ubuntu-tini sh -c sleep 10按 Ctrl-C 后SIGINT只发给了sh而sh在等sleep时并不理会它——看起来像是按了没反应。加上-g或设置TINI_KILL_PROCESS_GROUP变量名见 src/tini.c后tini 会把信号发给整个子进程组效果与终端里 Ctrl-C 打到前台进程组一致sh和sleep一起被终止。信号转发处的关键代码在 src/tini.ckill(kill_process_group ? -child_pid : child_pid, sig.si_signo)参数四-e 重映射退出码tini 默认透传子进程退出码被信号杀死时返回128 信号号。但有些程序退出码并不诚实最典型的是 Java 应用收到SIGTERM后以 143 退出导致容器编排平台误判为启动失败。用-e可以把任意退出码0~255重映射为 0并且可以重复使用tini -e 143 -e 137 -- /path/to/app解析函数add_expect_status会校验取值范围0~255在子进程退出时若命中重映射表就把退出码改写为 0实现位于 src/tini.c。参数五-p 设置父进程死亡信号-p参数让 tini 调用prctl(PR_SET_PDEATHSIG)设置父进程死亡信号当 tini 的父进程退出时内核会自动向 tini 发送你指定的信号如-p SIGKILLtini -p SIGTERM -- /path/to/app支持的信号名以SIG开头完整信号表SIGHUP ~ SIGSYS定义在 src/tini.c。常见用途是把 tini 挂在某个会话管理器或 shell 之下运行父进程意外消失时 tini 带着子进程一起善后避免留下孤儿进程。参数六-w 回收进程时打印警告正常情况下僵尸进程被回收是静默的加上-w后tini 每回收一个非主子的僵尸进程都会打印一条 WARN[WARN tini (123)] Reaped zombie process with pid456这在排查是谁在偷偷创建僵尸进程时非常有用——警告信息本身会暴露出僵尸的 PID方便你反查对应的代码路径。对应实现见 src/tini.c。顺手掌握其余选项与环境变量除 6 个核心参数外tini 还提供源码清单见 src/tini.c--version输出版本号并退出-h打印帮助信息用法tini [OPTIONS] PROGRAM -- [ARGS]-l打印许可证后退出。环境变量与参数的对应关系TINI_SUBREAPER≈-sTINI_KILL_PROCESS_GROUP≈-gTINI_VERBOSITY≈-v。快速上手Docker 中的推荐写法最省心的接法是把 tini 设为 entrypoint参数放在--之前程序放--之后ENTRYPOINT [/tini, -s, -g, --] CMD [/your/program, -and, its, arguments]⚠️ 注意--分隔符建议永远带上。如果看到tini: invalid option之类的报错多半是程序自己的参数被 tini 误当成自己的选项了加上--即可解决。已有 entrypoint 脚本也能无缝套用ENTRYPOINT [/tini, --, /docker-entrypoint.sh]。完整使用说明可参考 README.md 与 README.md 的 Options 章节。常见问题FAQQ1参数顺序有讲究吗tini 自身的选项放在程序名之前例如tini -v -e 143 -- app -x。程序及其参数放在--之后最安全。Q2-s和 PID 1 二选一两者都能保证僵尸被正确回收运行在 PID 1 时-s无需添加。Q3多个-e如何生效每个-e独立生效命中任一重映射码都会归零适合为不同信号退出码分别兜底。Q4看不到警告就代表配置正确是的。tini 启动时会自检reaper_check见 src/tini.c非 PID 1 且未注册 subreaper 才告警没告警即说明僵尸回收链路健康 ✅小结tini 的参数选项并不多但每个都精准对应容器运行的真实痛点-v帮你看清行为-s解决非 PID 1 的僵尸回收-g让信号覆盖整个进程组-e修正退出码-p处理父进程异常退出-w辅助定位僵尸来源。把这 6 个参数记住你就能在任何容器场景下正确使用 tini 这个小而完整的 init 进程了。【免费下载链接】tiniA tiny but valid init for containers项目地址: https://gitcode.com/gh_mirrors/ti/tini创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考