Je li OpenVPN up skripta pokrenuta prerano ili nikada nije bila spremna?
up kuka se pokreće kada se tunelski uređaj pojavi, prije ruta i spremnosti aplikacija. Uskladite skriptu s događajem koji joj treba umjesto dodavanja čekanja.
up skripta se pokreće, izlazi s nulom i zadatak unutar nje ne uspijeva doći do privatne usluge koja dvije sekunde kasnije savršeno radi iz terminala. Instinkt je tajming, a uobičajeni popravak je čekanje, koje skriva utrku bez razumijevanja. Korisnije čitanje je da “up” imenuje kuku, a ne garanciju spremnosti. Aktivira se kada se tunelski uređaj konfigurira, što je ranije od ruta, DNS-a i svakako ranije od bilo koje aplikacije iza tunela.
Test u ljusci je uspio jer se izvršio nakon što se sve smirilo. Kuka se izvršila u jednom određenom trenutku.
Gdje up stoji u redoslijedu pokretanja
OpenVPN konfigurira tunelski uređaj i zatim pokreće up kuku. Instalacija ruta je kasnija faza i ima vlastitu kuku, zbog čega zadatak ovisan o ruti smješten u up može vidjeti uređaj bez korisne putanje. Stavite rad s rutama u route-up i problem tajminga obično nestaje.
Priručnik dokumentira ovaj redoslijed i okruženje koje svaka kuka dobiva. Taj redoslijed je cijelo objašnjenje klasičnog izvještaja “radi iz moje ljuske”, a također je razlog zašto ista skripta može proći na jednom računalu i pasti na drugom sa sporijom fazom ruta. Nijedan rezultat ne govori ništa o kvaliteti skripte.
Spremnost DNS-a i aplikacija dolazi još kasnije. Čak i instalirane rute nisu dokaz da udaljeni kraj sluša, da se ime razrješava ili da postoji sesija radne površine za zadatak vezan uz korisnika.
Što kuka zapravo nasljeđuje
Kuka se izvršava pod računom i okruženjem procesa OpenVPN, što nije isto kao vaša interaktivna ljuska. Može joj nedostajati korisnička sabirnica sesije, okruženje radne površine ili vjerodajnica koja se otključava samo pri prijavi. Zapišite što od toga zadatak stvarno treba.
To je važno za zadatke koji izgledaju mrežno, ali ovise o korisničkom kontekstu: montiranje dijeljenog resursa s korisničkim vjerodajnicama, postavljanje proxyja po korisniku ili konfiguriranje pisača. Privilegirana tunelska kuka je pogrešno mjesto za njih i nikakvo čekanje ne popravlja sesiju koja nedostaje.
Kada zadatak ne uspije u kuki, zabilježite račun, okruženje i prvu operaciju koja nije uspjela. To odvaja prerani tajming od problema s dopuštenjima ili kontekstom, a ta dva imaju potpuno različite popravke. Nagađanje između njih je način na koji popravak od pet minuta postaje cijelo poslijepodne.
Zašto dodavanje čekanja nije provjera spremnosti
Čekanje odgađa skriptu i pomiče prozor utrke. Na brz dan zadatak uspijeva; na spor dan ponovno pada, a kvar je teže reproducirati jer se čini da odgoda radi. Odgoda koja radi samo pod laganim opterećenjem je slučajnost, a ne popravak.
Ako je ovisnost ruta, upotrijebite kuku koja odgovara instalaciji rute. Ako je ovisnost usluga iza tunela, upotrijebite ograničenu provjeru koja čeka točno taj uvjet i jasno pada kada nikada ne stigne.
Držite kvar eksplicitnim. Kuka koja izlazi s nulom dok je njezin stvarni posao propao gora je od kuke koja pada, jer upravitelj usluga bilježi uspjeh i nitko više ne gleda. Redak dnevnika iz same skripte najjeftiniji je način da to ostane pošteno.
Čišćenje i ponovno povezivanje zaslužuju istu pažnju
Skripta koja mijenja zajedničko stanje treba odgovarajući put za poništavanje. Rute, unosi razrješivača i oznake vatrozida koje doda kuka moraju biti idempotentne i reverzibilne, inače će ponovno povezivanje nasložiti drugu kopiju na prvu.
Ponovna povezivanja također mogu pokretati kuke češće od punog pokretanja usluge. Trajno sučelje koje ponovno uspostavlja sesiju može ponovno pokrenuti ciklus up i route-up, pa će skripta koja pretpostavlja jedno izvršenje po podizanju sustava na kraju pogriješiti. Prebrojite izvršenja u dnevniku tijekom dana treperenja da vidite koliko često se stvarno izvršava. Zatim učinite skriptu sigurnom za toliko izvršenja.
Testirajte životni ciklus koji nije uspio, a ne kasniju naredbu. Reproducirajte podizanje sustava ili ponovno povezivanje, promatrajte izvršenje kuke i potvrdite da je zadatak uspio u trenutku kada se stvarno izvršava. Uspjeh iz interaktivne ljuske nakon toga dokaz je o ovisnosti, a ne dokaz da putanja pokretanja radi.
Imenujte događaj o kojem svaki zadatak ovisi, zatim ga povežite s tim događajem. Sve ostalo je odgoda koja se pretvara da je provjera.