Lo script up viene eseguito, esce con codice zero e il compito al suo interno non riesce a raggiungere un servizio privato che da un terminale funziona perfettamente due secondi dopo. L’istinto è la questione dei tempi, e la riparazione abituale è una pausa, che nasconde la corsa senza comprenderla. La lettura più utile è che “up” indica un hook, non una garanzia di prontezza. Scatta quando il dispositivo del tunnel è configurato, cioè prima delle route, del DNS e certamente prima di qualsiasi applicazione dietro il tunnel.

Il test nella shell è riuscito perché è stato eseguito dopo che tutto si era stabilizzato. L’hook è stato eseguito in un momento preciso.

Dove si colloca up nell’ordine di avvio

OpenVPN configura il dispositivo del tunnel e poi esegue l’hook up. L’installazione delle route è una fase successiva e ha il proprio hook, ed è per questo che un compito dipendente dalle route inserito in up può vedere un dispositivo senza un percorso utile. Metti il lavoro sulle route in route-up e il problema dei tempi di solito scompare.

Il manuale documenta questo ordine e l’ambiente che riceve ciascun hook. Quell’ordine è l’intera spiegazione del classico resoconto “funziona dalla mia shell”, ed è anche il motivo per cui lo stesso script può passare su una macchina e fallire su un’altra con una fase di route più lenta. Nessuno dei due risultati dice nulla sulla qualità dello script.

Il DNS e la prontezza delle applicazioni arrivano ancora più tardi. Anche le route installate non sono prova che l’endpoint remoto sia in ascolto, che un nome si risolva o che esista una sessione desktop per un compito legato all’utente.

Cosa eredita davvero l’hook

Un hook viene eseguito con l’account e l’ambiente del processo OpenVPN, il che non equivale alla tua shell interattiva. Può mancare il bus di sessione dell’utente, un ambiente desktop o una credenziale sbloccata solo all’accesso. Annota quale di questi elementi serve davvero al compito.

Questo conta per i compiti che sembrano di rete ma dipendono da un contesto utente: montare una condivisione con una credenziale utente, impostare un proxy per singolo utente o configurare una stampante. Un hook di tunnel privilegiato è il posto sbagliato per loro, e nessuna attesa ripara una sessione mancante.

Quando un compito fallisce in un hook, registra l’account, l’ambiente e la prima operazione fallita. Questo separa una questione di tempi prematuri da un problema di permessi o di contesto, e i due hanno riparazioni completamente diverse. Tirare a indovinare tra i due è il modo in cui una correzione da cinque minuti diventa un pomeriggio intero.

Perché aggiungere una pausa non è un controllo di prontezza

Una pausa ritarda lo script e sposta la finestra della corsa. In una giornata veloce il compito riesce; in una giornata lenta fallisce di nuovo, e il guasto diventa più difficile da riprodurre perché il ritardo sembra funzionare. Un ritardo che funziona solo sotto carico leggero è una coincidenza, non una riparazione.

Se la dipendenza è una route, usa l’hook che corrisponde all’installazione delle route. Se la dipendenza è un servizio dietro il tunnel, usa un controllo limitato che attende quella condizione specifica e fallisce chiaramente quando non arriva mai.

Mantieni esplicito il fallimento. Un hook che esce con zero mentre il suo lavoro effettivo è fallito è peggio di un hook che fallisce, perché il gestore dei servizi registra un successo e nessuno guarda più. Una riga di log dallo script stesso è il modo più economico per mantenerlo onesto.

Pulizia e riconnessione meritano la stessa cura

Uno script che modifica uno stato condiviso richiede un percorso di annullamento corrispondente. Le route, le voci del resolver e i contrassegni del firewall aggiunti da un hook dovrebbero essere idempotenti e reversibili, altrimenti una riconnessione sovrapporrà una seconda copia alla prima.

Le riconnessioni possono anche eseguire gli hook più spesso di un avvio completo del servizio. Un’interfaccia persistente che ristabilisce una sessione può attivare di nuovo il ciclo up e route-up, quindi uno script che presume una sola esecuzione per avvio prima o poi si comporterà male. Conta le esecuzioni nel log durante una giornata di oscillazioni per vedere quanto spesso viene davvero eseguito. Poi rendi lo script sicuro da eseguire tutte quelle volte.

Verifica il ciclo di vita che ha fallito, non un comando successivo. Riproduci l’avvio o la riconnessione, osserva l’esecuzione dell’hook e conferma che il compito sia riuscito nel momento in cui viene realmente eseguito. Un successo da una shell interattiva dopo è una prova sulla dipendenza, non la prova che il percorso di avvio funzioni.

Dai un nome all’evento da cui dipende ogni compito, poi collegalo a quell’evento. Tutto il resto è un ritardo che finge di essere un controllo.

Articoli correlati