#!/bin/sh set -eu : "${SUPERVISORD_BIN:=/usr/bin/supervisord}" : "${SUPERVISOR_CONF_TEMPLATE:=/etc/supervisord.conf.template}" : "${APP_BINARY_PATH:=/app/app}" : "${RUNTIME_DIR:=/tmp/runtime}" : "${SUPERVISOR_CONF:=/etc/supervisord.conf}" : "${SUPERVISOR_PROGRAM_NAME:=app}" : "${OPEN_FILE_LIMIT:=65535}" export RUNTIME_DIR shell_quote() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\"'\"'/g")" } escape_sed_replacement() { printf '%s' "$1" | sed 's/[\/&]/\\&/g' } write_supervisord_conf() { mkdir -p "$(dirname "$SUPERVISOR_CONF")" app_program_name=$(escape_sed_replacement "$SUPERVISOR_PROGRAM_NAME") sed \ -e "s/__APP_PROGRAM__/$app_program_name/g" \ "$SUPERVISOR_CONF_TEMPLATE" > "$SUPERVISOR_CONF" } write_run_app_script() { run_app_script="$RUNTIME_DIR/run-app.sh" { printf '#!/bin/sh\n' printf 'set -eu\n' printf 'exec "%s"' "$APP_BINARY_PATH" for arg in "$@"; do printf ' %s' "$(shell_quote "$arg")" done printf '\n' } > "$run_app_script" chmod +x "$run_app_script" } prepare_runtime_environment() { ulimit -n "$OPEN_FILE_LIMIT" mkdir -p "$RUNTIME_DIR" rm -f "$RUNTIME_DIR/supervisor.sock" "$RUNTIME_DIR/supervisord.pid" } validate_app_binary_or_exit() { if [ ! -x "$APP_BINARY_PATH" ]; then echo "错误: APP_BINARY_PATH 指向的文件不存在或不可执行: $APP_BINARY_PATH" >&2 exit 1 fi } start_supervisord() { exec "$SUPERVISORD_BIN" -c "$SUPERVISOR_CONF" } main() { prepare_runtime_environment validate_app_binary_or_exit write_supervisord_conf write_run_app_script "$@" start_supervisord } main "$@"