#!/bin/sh # uhttpd 进程监控守护进程 2025-2026 by sirpdboy PROG="uhttpd-watchdog" UHTTPD_BIN="/usr/sbin/uhttpd" UHTTPD_SERVICE="uhttpd" CHECK_INTERVAL=30 # 检查间隔(秒) MAX_FAILURES=3 # 最大连续失败次数 LOG_IDENT="$PROG" log() { logger -t "$LOG_IDENT" "$1" } check_binary() { if [ ! -x "$UHTTPD_BIN" ]; then log "错误:$UHTTPD_BIN 不存在或不可执行,监控停止" return 1 fi return 0 } check_process() { if pgrep -f "/usr/sbin/uhttpd" >/dev/null 2>&1 || \ pgrep -x uhttpd >/dev/null 2>&1; then return 0 fi return 1 } restart_service() { log "尝试重启 $UHTTPD_SERVICE 服务..." if /etc/init.d/$UHTTPD_SERVICE restart >/dev/null 2>&1; then sleep 3 # 等待服务启动 if check_process; then log "$UHTTPD_SERVICE 重启成功" return 0 else log "$UHTTPD_SERVICE 重启后进程仍不存在" return 1 fi else log "执行 service $UHTTPD_SERVICE restart 失败" return 1 fi } monitor_loop() { local failures=0 log "启动 $UHTTPD_SERVICE 监控守护进程" while true; do # 检查二进制文件 if ! check_binary; then sleep 60 continue fi # 检查进程状态 if ! check_process; then failures=$((failures + 1)) log "检测到 $UHTTPD_SERVICE 进程停止 (失败次数: $failures/$MAX_FAILURES)" if [ $failures -ge $MAX_FAILURES ]; then log "达到最大失败次数,尝试重启服务..." if restart_service; then failures=0 else sleep 60 fi fi else # 进程正常,重置失败计数器 if [ $failures -gt 0 ]; then log "$UHTTPD_SERVICE 恢复正常运行" failures=0 fi fi sleep $CHECK_INTERVAL done } start() { if pgrep -f "$PROG" | grep -v $$ >/dev/null 2>&1; then log "警告:$PROG 已经在运行" exit 1 fi monitor_loop } stop() { pkill -f "$PROG" 2>/dev/null log "监控服务已停止" } case "$1" in start) start ;; stop) stop ;; *) echo "用法: $0 {start|stop}" exit 1 ;; esac