#!/bin/bash # ============================================================================== # Watchdog Guacamole — autocorregge i blocchi noti prima che Mauro se ne accorga # ============================================================================== # Caso 1 ("Attendi risposta"): x11vnc-guacamole.service non attivo -> riavvio. # Caso 2 (schermo nero): il blocco schermo per inattività ha reso attiva una # seconda sessione X invece di quella su DISPLAY :0 (dove x11vnc è agganciato, # vedi ExecStart del service) -> loginctl activate sulla sessione giusta. # Caso 3 ("Attendi risposta", 31/08/2026): x11vnc risulta is-active (non crasha) # ma si blocca dopo un "caught X11 error" nel proprio log — bug noto di x11vnc # con xdamage, non gestito con grazia. Il Caso 1 sopra non lo rileva perché il # processo resta tecnicamente "attivo", solo zombie. Fix: cercare la riga # "caught X11 error" comparsa dal controllo precedente e riavviare comunque. # Pattern noto, dettaglio in memory/MEMORY.md sezione "Pattern riconosciuti". SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_FILE="$SCRIPT_DIR/logs/guacamole_watchdog.log" LAST_CHECK_FILE="$SCRIPT_DIR/logs/guacamole_watchdog_x11err.last" mkdir -p "$SCRIPT_DIR/logs" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # --- Caso 1: servizio x11vnc non attivo --- if ! systemctl is-active --quiet x11vnc-guacamole.service; then log "x11vnc-guacamole.service non attivo -> riavvio" sudo systemctl restart x11vnc-guacamole.service fi # --- Caso 3: x11vnc "attivo" ma bloccato da un errore X11 non gestito --- NOW_ISO="$(date -Iseconds)" if [ -f "$LAST_CHECK_FILE" ]; then SINCE="$(cat "$LAST_CHECK_FILE")" else SINCE="$(date -Iseconds -d '5 minutes ago')" fi if journalctl -u x11vnc-guacamole.service --since "$SINCE" --no-pager 2>/dev/null | grep -q "caught X11 error"; then log "caught X11 error rilevato dal controllo precedente -> riavvio (processo era is-active ma bloccato)" sudo systemctl restart x11vnc-guacamole.service fi echo "$NOW_ISO" > "$LAST_CHECK_FILE" # --- Caso 2: sessione su DISPLAY :0 non attiva --- for sid in $(loginctl list-sessions --no-legend 2>/dev/null | awk '{print $1}'); do display="$(loginctl show-session "$sid" -p Display --value 2>/dev/null)" if [[ "$display" == ":0" ]]; then active="$(loginctl show-session "$sid" -p Active --value 2>/dev/null)" if [[ "$active" != "yes" ]]; then log "Sessione $sid (display :0) online ma non active -> loginctl activate" sudo loginctl activate "$sid" fi break fi done