diff --git a/setup_cups.sh b/setup_cups.sh index 8102e7f..333c97d 100755 --- a/setup_cups.sh +++ b/setup_cups.sh @@ -1180,6 +1180,7 @@ PING_TARGETS="$ping_targets" FAIL_THRESHOLD=3 DHCP_AFTER_FAILURE=1 LOG_FILE="/var/log/cups-watchdog/network.log" +MAX_LOG_SIZE_KB=256 EOF chmod 600 "$config_dir/network-watchdog.conf" else @@ -1197,6 +1198,7 @@ COMMAND_TIMEOUT=8 FAIL_THRESHOLD=2 RESTART_COOLDOWN=60 LOG_FILE="/var/log/cups-watchdog/print.log" +MAX_LOG_SIZE_KB=256 EOF chmod 600 "$config_dir/print-watchdog.conf" else @@ -1531,7 +1533,7 @@ main() { success "Avahi 服务已启动并设置开机自启" # 8. 安装守护脚本 - install_watchdogs + install_watchdogs || warn "守护脚本安装失败,请稍后重新运行安装脚本或手动检查 watchdog 目录" # 更新IP地址(如果配置了静态IP) LOCAL_IP=$(get_ip) @@ -1577,6 +1579,9 @@ main() { echo -e " ${GREEN} ${NC} 配置目录: /etc/cups-watchdog/" echo -e " ${GREEN} ${NC} 日志目录: /var/log/cups-watchdog/" echo "" + else + echo -e " ${YELLOW}[守护脚本]${NC} 未检测到已启用状态,请检查安装日志" + echo "" fi echo -e " ${YELLOW}下一步:${NC}" echo " 1. 用浏览器打开上面的地址" diff --git a/watchdog/network-watchdog.sh b/watchdog/network-watchdog.sh index 9a4e35c..a485192 100644 --- a/watchdog/network-watchdog.sh +++ b/watchdog/network-watchdog.sh @@ -24,6 +24,7 @@ PING_TARGETS="223.5.5.5 114.114.114.114" FAIL_THRESHOLD=3 DHCP_AFTER_FAILURE=1 LOG_FILE="/var/log/cups-watchdog/network.log" +MAX_LOG_SIZE_KB=256 if [ -f "$CONFIG_FILE" ]; then # shellcheck disable=SC1090 @@ -33,9 +34,29 @@ fi mkdir -p "$STATE_DIR" 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() { local msg="$1" local line + rotate_log line="$(date '+%Y-%m-%d %H:%M:%S') [network-watchdog] $msg" echo "$line" echo "$line" >> "$LOG_FILE" 2>/dev/null || true @@ -223,8 +244,22 @@ configure_static() { } connectivity_ok() { + local iface + local gateway 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 [ -n "$target" ] || continue if ping -c 1 -W 2 "$target" >/dev/null 2>&1; then @@ -260,12 +295,15 @@ check_network() { case "${1:-check}" in check) + acquire_lock check_network ;; dhcp) + acquire_lock configure_dhcp ;; static) + acquire_lock configure_static ;; *) diff --git a/watchdog/print-watchdog.sh b/watchdog/print-watchdog.sh index 417a65b..f5fb6a7 100644 --- a/watchdog/print-watchdog.sh +++ b/watchdog/print-watchdog.sh @@ -18,6 +18,7 @@ COMMAND_TIMEOUT=8 FAIL_THRESHOLD=2 RESTART_COOLDOWN=60 LOG_FILE="/var/log/cups-watchdog/print.log" +MAX_LOG_SIZE_KB=256 if [ -f "$CONFIG_FILE" ]; then # shellcheck disable=SC1090 @@ -27,9 +28,29 @@ fi mkdir -p "$STATE_DIR" 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() { local msg="$1" local line + rotate_log line="$(date '+%Y-%m-%d %H:%M:%S') [print-watchdog] $msg" echo "$line" echo "$line" >> "$LOG_FILE" 2>/dev/null || true @@ -150,9 +171,11 @@ check_print_stack() { case "${1:-check}" in check) + acquire_lock check_print_stack ;; restart) + acquire_lock restart_print_stack ;; *)