#!/bin/bash set -e # 添加日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" } # 捕获 SIGTERM 信号,优雅关闭所有后台进程 trap "log '收到终止信号,关闭进程...'; kill \$(jobs -p) 2>/dev/null; exit 0" SIGTERM # 读取服务配置 services=$(jq -c '.[]' services.json) # 启动服务 echo "$services" | while read -r service; do name=$(echo $service | jq -r '.name') command=$(echo $service | jq -r '.command') port=$(echo $service | jq -r '.port') working_dir=$(echo $service | jq -r '.working_dir // "/home/pn/app"') log "Starting $name on port $port in directory $working_dir" # 设置环境变量 eval $(echo $service | jq -r '.env // {} | to_entries | .[] | "export " + .key + "=\"" + .value + "\""') # 切换到工作目录并启动服务 if [ ! -d "$working_dir" ]; then log "ERROR: Directory $working_dir does not exist" exit 1 fi (cd $working_dir && PORT=$port eval "$command") & # 记录进程ID pids+=($!) log "$name started with PID ${pids[-1]}" done # 等待服务启动 sleep 5 # 启动 Traefik exec traefik --configFile=$TRAEFIK_CONFIG_FILE