mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-07-29 18:01:55 +08:00
110 lines
2.4 KiB
Bash
110 lines
2.4 KiB
Bash
#!/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
|