如何让Alpine兼容的多进程启动脚本适配Debian 11?
适配Debian 11的Heroku多进程启动脚本修改方案
原脚本在Alpine(使用ash解释器)可正常运行,但在Debian 11下因默认/bin/sh为dash解释器,存在两个兼容性问题:
trap: SIGTERM: bad trap:dash不支持trap '' SIGTERM的信号忽略写法wait: Illegal option -n:dash不支持wait -n(等待任意子进程退出)的参数
以下提供两种修改方案:
方案一:改用Bash解释器(推荐)
Debian 11默认预装Bash,修改脚本解释器后可直接兼容原逻辑:
#!/bin/bash set -e # set -x # 忽略SIGTERM信号,防止脚本在子进程退出前被终止 trap ':' SIGTERM puma -C config/puma.rb & PUMA_PID=$! sidekiq & SIDEKIQ_PID=$! # 等待任意一个子进程退出 wait -n # 向当前进程组发送SIGTERM,终止剩余子进程 kill -SIGTERM -$$ # 等待所有子进程完全退出 wait
修改说明
- 替换
#!/bin/sh为#!/bin/bash:Bash支持wait -n和标准的信号忽略写法 - 修正
trap语句:使用trap ':' SIGTERM作为Bash中忽略信号的标准写法 - 新增子进程PID记录(可选):方便后续单独管理子进程
方案二:兼容Dash解释器(保留#!/bin/sh)
若必须使用/bin/sh(dash),需替换wait -n的实现逻辑:
#!/bin/sh set -e # set -x # dash兼容的SIGTERM信号忽略写法 trap ':' SIGTERM puma -C config/puma.rb & PUMA_PID=$! sidekiq & SIDEKIQ_PID=$! # 循环检查子进程状态,直到其中一个退出 while kill -0 $PUMA_PID $SIDEKIQ_PID 2>/dev/null; do sleep 1 done # 终止剩余存活的子进程 kill -SIGTERM $PUMA_PID $SIDEKIQ_PID 2>/dev/null # 等待所有子进程完全退出 wait
修改说明
- 用
kill -0循环检查子进程存活状态:替代wait -n实现"等待任意子进程退出"的逻辑 - 直接向已知子进程PID发送终止信号:避免向进程组发信号可能带来的误杀风险
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

