Četrdeset .ovpn datoteka za jednu zemlju dolazi od provajdera, a plan izgleda očigledno: kopirajte slučajnu na mjesto, zatim pokrenite tunel. Kada se to napiše kao cjevovod unutar ExecStart, plan umire pri podizanju sa statusnim kodom koji ništa ne objašnjava. Datoteka jedinice nije skripta, a popravka je ili da eksplicitno dovedete ljusku ili da potpuno prestanete birati datoteke.

Simptom: jedinica koja se pokrene i odmah umre

Status pokazuje da je servis pao u djeliću sekunde, a red u dnevniku navodi naredbu koju nijedna ljuska nikada ne bi primila. Ništa o tunelu se ne pojavljuje, jer tunel nikada nije počeo.

Čitanje tačne naredbene linije iz dnevnika najbrži je način da to potvrdite. systemd ponavlja ono što je izvršio, a niz će pokazati znakove cjevovoda kao doslovne argumente, a ne kao operatore.

Zašto ExecStart ne može pokrenuti cjevovod

systemd sam dijeli naredbenu liniju, primjenjuje vlastito citiranje i zamjenu varijabli, a zatim izvršava rezultat direktno. Cjevovodi, preusmjeravanje, glob ljuske i zamjena naredbi jednostavno nisu dio te gramatike. To je dizajnerski izbor, a ne propust: jedinica je deklarativna o tome šta pokrenuti, a logika ljuske pripada skripti koju jedinica poziva. Obje popravke slijede iz toga i nijedna ne zahtijeva da jedinica dobije više privilegija.

To također objašnjava zavaravajući izlazni kod. Prvi argument se tretira kao binarna datoteka, pa neispravna linija pada prije nego što se pokrene ijedan dio vaše logike.

Obavite odabir u ExecStartPre

Direktna popravka je pripremni korak koji eksplicitno poziva ljusku i drži odabir i pokretanje u istoj jedinici, tako da neuspjeh u jednom ne može ostaviti drugo da radi samo.

[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf

Tri detalja odlučuju hoće li ovo preživjeti susret sa stvarnim računarom. Imenovanje je prva zamka: systemd zamjenjuje %i još pri raščlanjivanju jedinice, mnogo prije nego što se bash pokrene, pa specifikator mora stajati izvan jednostrukih navodnika. xargs -r sprječava da se cp pokrene bez argumenta kada glob ništa ne pronađe. A neuspješan pripremni korak zaustavlja jedinicu, i to je ispravan ishod: pokretanje s jučerašnjom konfiguracijom gore je od nepodizanja. Slučajan odabir koji uvijek uzme istu datoteku obično nije loša sreća. Provjerite prepisuje li kopiranu datoteku ažuriranje paketa ili glob odgovara samo jednom zastarjelom zapisu.

Ili pustite OpenVPN da odabere krajnju tačku

OpenVPN već može držati nekoliko krajnjih tačaka u jednom profilu i birati među njima slučajno, što u potpunosti uklanja ljusku, kopiranje i pravo pisanja iz putanje podizanja.

client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>

Ovaj oblik drži odabir servera unutar datoteke koju je napravio provajder, pa rotacija koja preimenuje datoteke ne kvari jedinicu. On također čini listu kandidata provjerljivom, što glob nad direktorijem nikada nije. Miješanje ipak zaslužuje svoje mjesto kada se profili razlikuju u više od krajnje tačke: različiti certifikati, različite direktive usmjeravanja, različita politika šifri. U tom slučaju odabir je između cijelih konfiguracija i korak s ljuskom je iskren način da se to izrazi.

Pročitajte natrag instancu i datoteku koju je koristila

Potvrdite koja jedinica stvarno radi prije nego što otklanjate greške u njenom sadržaju. Pakirana meta usluga i predložak su infrastruktura; jedinice koje odgovaraju vašim datotekama su instance nazvane po njima.

systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager

Instanca za koju se niko ne sjeća da ju je omogućio obično vodi do zalutale konfiguracijske datoteke u direktoriju paketa. Isključite tu imenovanu instancu umjesto predloška, inače je sljedeće ažuriranje paketa vraća. Nakon promjene pokrenite jedinicu i pročitajte naredbenu liniju koju dnevnik prijavljuje, zatim potvrdite putanju konfiguracije koju je stvarno otvorila. Ta jedna provjera razdvaja ispravan slučajan odabir od servisa koji tiho ponovno koristi datoteku od prošlog mjeseca.

Povezani članci