fix: improve watchdog reliability

This commit is contained in:
2026-06-09 15:05:23 +08:00
parent 00d512f9d9
commit 87b3129374
3 changed files with 67 additions and 1 deletions

View File

@@ -1180,6 +1180,7 @@ PING_TARGETS="$ping_targets"
FAIL_THRESHOLD=3 FAIL_THRESHOLD=3
DHCP_AFTER_FAILURE=1 DHCP_AFTER_FAILURE=1
LOG_FILE="/var/log/cups-watchdog/network.log" LOG_FILE="/var/log/cups-watchdog/network.log"
MAX_LOG_SIZE_KB=256
EOF EOF
chmod 600 "$config_dir/network-watchdog.conf" chmod 600 "$config_dir/network-watchdog.conf"
else else
@@ -1197,6 +1198,7 @@ COMMAND_TIMEOUT=8
FAIL_THRESHOLD=2 FAIL_THRESHOLD=2
RESTART_COOLDOWN=60 RESTART_COOLDOWN=60
LOG_FILE="/var/log/cups-watchdog/print.log" LOG_FILE="/var/log/cups-watchdog/print.log"
MAX_LOG_SIZE_KB=256
EOF EOF
chmod 600 "$config_dir/print-watchdog.conf" chmod 600 "$config_dir/print-watchdog.conf"
else else
@@ -1531,7 +1533,7 @@ main() {
success "Avahi 服务已启动并设置开机自启" success "Avahi 服务已启动并设置开机自启"
# 8. 安装守护脚本 # 8. 安装守护脚本
install_watchdogs install_watchdogs || warn "守护脚本安装失败,请稍后重新运行安装脚本或手动检查 watchdog 目录"
# 更新IP地址如果配置了静态IP # 更新IP地址如果配置了静态IP
LOCAL_IP=$(get_ip) LOCAL_IP=$(get_ip)
@@ -1577,6 +1579,9 @@ main() {
echo -e " ${GREEN} ${NC} 配置目录: /etc/cups-watchdog/" echo -e " ${GREEN} ${NC} 配置目录: /etc/cups-watchdog/"
echo -e " ${GREEN} ${NC} 日志目录: /var/log/cups-watchdog/" echo -e " ${GREEN} ${NC} 日志目录: /var/log/cups-watchdog/"
echo "" echo ""
else
echo -e " ${YELLOW}[守护脚本]${NC} 未检测到已启用状态,请检查安装日志"
echo ""
fi fi
echo -e " ${YELLOW}下一步:${NC}" echo -e " ${YELLOW}下一步:${NC}"
echo " 1. 用浏览器打开上面的地址" echo " 1. 用浏览器打开上面的地址"

View File

@@ -24,6 +24,7 @@ PING_TARGETS="223.5.5.5 114.114.114.114"
FAIL_THRESHOLD=3 FAIL_THRESHOLD=3
DHCP_AFTER_FAILURE=1 DHCP_AFTER_FAILURE=1
LOG_FILE="/var/log/cups-watchdog/network.log" LOG_FILE="/var/log/cups-watchdog/network.log"
MAX_LOG_SIZE_KB=256
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
# shellcheck disable=SC1090 # shellcheck disable=SC1090
@@ -33,9 +34,29 @@ fi
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true
acquire_lock() {
local lock_dir="$STATE_DIR/network.lock"
if ! mkdir "$lock_dir" 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [network-watchdog] another run is active"
exit 0
fi
trap 'rmdir "$lock_dir" 2>/dev/null || true' EXIT
}
rotate_log() {
local max_bytes=$((MAX_LOG_SIZE_KB * 1024))
if [ -f "$LOG_FILE" ] && [ "$(wc -c < "$LOG_FILE" 2>/dev/null || echo 0)" -gt "$max_bytes" ]; then
mv "$LOG_FILE" "$LOG_FILE.1" 2>/dev/null || true
: > "$LOG_FILE"
fi
}
log_msg() { log_msg() {
local msg="$1" local msg="$1"
local line local line
rotate_log
line="$(date '+%Y-%m-%d %H:%M:%S') [network-watchdog] $msg" line="$(date '+%Y-%m-%d %H:%M:%S') [network-watchdog] $msg"
echo "$line" echo "$line"
echo "$line" >> "$LOG_FILE" 2>/dev/null || true echo "$line" >> "$LOG_FILE" 2>/dev/null || true
@@ -223,8 +244,22 @@ configure_static() {
} }
connectivity_ok() { connectivity_ok() {
local iface
local gateway
local target local target
iface="$(detect_interface)"
if [ -n "$iface" ] && [ -f "/sys/class/net/$iface/carrier" ]; then
if [ "$(cat "/sys/class/net/$iface/carrier" 2>/dev/null || echo 0)" != "1" ]; then
return 1
fi
fi
gateway="$(ip route show default 2>/dev/null | awk '{print $3; exit}')"
if [ -n "$gateway" ] && ping -c 1 -W 2 "$gateway" >/dev/null 2>&1; then
return 0
fi
for target in $PING_TARGETS; do for target in $PING_TARGETS; do
[ -n "$target" ] || continue [ -n "$target" ] || continue
if ping -c 1 -W 2 "$target" >/dev/null 2>&1; then if ping -c 1 -W 2 "$target" >/dev/null 2>&1; then
@@ -260,12 +295,15 @@ check_network() {
case "${1:-check}" in case "${1:-check}" in
check) check)
acquire_lock
check_network check_network
;; ;;
dhcp) dhcp)
acquire_lock
configure_dhcp configure_dhcp
;; ;;
static) static)
acquire_lock
configure_static configure_static
;; ;;
*) *)

View File

@@ -18,6 +18,7 @@ COMMAND_TIMEOUT=8
FAIL_THRESHOLD=2 FAIL_THRESHOLD=2
RESTART_COOLDOWN=60 RESTART_COOLDOWN=60
LOG_FILE="/var/log/cups-watchdog/print.log" LOG_FILE="/var/log/cups-watchdog/print.log"
MAX_LOG_SIZE_KB=256
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
# shellcheck disable=SC1090 # shellcheck disable=SC1090
@@ -27,9 +28,29 @@ fi
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true
acquire_lock() {
local lock_dir="$STATE_DIR/print.lock"
if ! mkdir "$lock_dir" 2>/dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [print-watchdog] another run is active"
exit 0
fi
trap 'rmdir "$lock_dir" 2>/dev/null || true' EXIT
}
rotate_log() {
local max_bytes=$((MAX_LOG_SIZE_KB * 1024))
if [ -f "$LOG_FILE" ] && [ "$(wc -c < "$LOG_FILE" 2>/dev/null || echo 0)" -gt "$max_bytes" ]; then
mv "$LOG_FILE" "$LOG_FILE.1" 2>/dev/null || true
: > "$LOG_FILE"
fi
}
log_msg() { log_msg() {
local msg="$1" local msg="$1"
local line local line
rotate_log
line="$(date '+%Y-%m-%d %H:%M:%S') [print-watchdog] $msg" line="$(date '+%Y-%m-%d %H:%M:%S') [print-watchdog] $msg"
echo "$line" echo "$line"
echo "$line" >> "$LOG_FILE" 2>/dev/null || true echo "$line" >> "$LOG_FILE" 2>/dev/null || true
@@ -150,9 +171,11 @@ check_print_stack() {
case "${1:-check}" in case "${1:-check}" in
check) check)
acquire_lock
check_print_stack check_print_stack
;; ;;
restart) restart)
acquire_lock
restart_print_stack restart_print_stack
;; ;;
*) *)