2024 年 10 月 10 日逐行解释用于 Docker 容器的 0009 PID 1 Bash 脚本

主要观点:介绍在容器中运行多个进程的方法,通过 Bash 脚本实现,包括使用exec避免中间的 bash shell,trap处理信号,wait等待进程结束等,还提到若不想让脚本成为 PID 1 进程可修改kill命令的参数。
关键信息:

  • 容器中多个进程需有一个主进程(PID 1),负责启动其他进程、重复信号等。
  • #!/usr/bin/env bash set -euo pipefail配置 Bash 脚本的运行环境和选项。
  • function main {... } main "$@"定义主函数并处理传入参数。
  • trap 'true' SIGINT SIGTERM捕获信号并执行true
  • exec service-a & exec service-b &在后台运行多个进程。
  • wait -n || true等待后台进程结束,处理waittrap的特殊情况。
  • kill -s SIGINT -1向除脚本自身外的所有进程发送SIGINT信号。
  • 更新部分:若不想成为 PID 1 进程,可将kill -s SIGINT -1改为kill -s SIGINT -$$,向脚本进程组内的所有进程发送信号。
    重要细节:
  • #!为 shebang,指定解释器。
  • /usr/bin/env bash利用环境 PATH 变量确定bash解释器。
  • set -e在命令退出码非零时立即退出脚本。
  • set -u使用未设置的变量视为错误。
  • set -o pipefail影响管道命令的退出码。
  • wait -n等待单个后台进程结束。
  • kill -1表示向除脚本自身外的所有进程发送信号。
  • -$$表示脚本进程组的 ID。使用kill时若不指定信号需用--分隔。
阅读 14
0 条评论