守护进程模式下 平滑重启方案

ichynul

守护进程模式下,需要运行命令

守护模式更新代码要到服务器上操作,如果开发人员没有服务器权限就不好办。
只能退而求其次,使用Supervisor之类的不加-d运行,但这种模式有个弊端,每次更新代码都会短暂502,好像还没好的办法解决(需要多套程序负载均衡)。

为此你搜索到了哪些方案及不适用的原因

问了AI,可以定时检测目录下reloadrestart两个文件,有就执行相关命令。
试了下,这种方案可行。
有没有办法在框架层面实现类似的?在Master进程应该能做到吧

#!/bin/bash

# ===================== 项目路径配置 =====================
PROJECTS=(
"/www/wwwroot/project1"
"/www/wwwroot/project2"
"/www/wwwroot/project3"
)
# ======================================================

PHP_BIN="php"
LOG_DIR="/var/log/webman_manager"
mkdir -p "$LOG_DIR"

# 每天一个日志文件
LOG_FILE="$LOG_DIR/webman_manager_$(date +%Y-%m-%d).log"

# 日志输出函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 自动清理 7 天前日志
find "$LOG_DIR" -name "webman_manager_*.log" -mtime +7 -delete

log "===== 开始检测项目 ====="

# 遍历项目
for PROJECT in "${PROJECTS[@]}"; do
    if [ ! -d "$PROJECT" ]; then
        log "项目不存在,跳过:$PROJECT"
        continue
    fi

    if [ ! -f "$PROJECT/start.php" ]; then
        log "非 Webman 项目,跳过:$PROJECT"
        continue
    fi

    # ==================== reload 平滑重启 ====================
    if [ -f "$PROJECT/reload" ]; then
        log "检测到 reload,执行平滑重启:$PROJECT"

        # 执行并把输出 全部写入日志
        cd "$PROJECT"
        $PHP_BIN start.php reload >> "$LOG_FILE" 2>&1

        rm -f "$PROJECT/reload"
        log "reload 执行完成,文件已删除"
    fi

    # ==================== restart 强制重启 ====================
    if [ -f "$PROJECT/restart" ]; then
        log "检测到 restart,执行强制重启:$PROJECT"

        # 执行并把输出 全部写入日志
        cd "$PROJECT"
        $PHP_BIN start.php restart >> "$LOG_FILE" 2>&1

        rm -f "$PROJECT/restart"
        log "restart 执行完成,文件已删除"
    fi
done

log "===== 本轮检测完成 ====="
62 1 0
1个回答

Mr.Gong

你可以在gitea或github的webhook针对分支设置回调勾子,请求你的项目地址,在接口接收到合并请求或master、product分支推送的操作类型时,推送队列消费执行sehll命令重启服务。
这样可以实现服务随代码变更自动重启

  • 暂无评论
🔝