Kopirajte radni naredbeni redak u ExecStart, ponovno učitajte i jedinica pada ili tiho izlazi jer se argumenti tretiraju kao nazivi datoteka. U systemd-u ništa nije pokvareno. ExecStart je popis argumenata, a ne shell, pa cjevovodi, preusmjeravanje i uvjeti gube smisao onog trena kad napuste vaš terminal. Odlučite gdje pripada shell, zatim napišite jedinicu koja točno kaže što se treba izvršiti.

Zašto cjevovod u ExecStart-u ne radi ništa

Kad se naredba upiše u terminal, shell je prvo raščlanjuje. Gradi cjevovod, otvara datoteke za preusmjeravanje i proširuje varijable prije nego što se pokrene bilo koji program. systemd ne radi ništa od toga: dijeli ExecStart prema vlastitim pravilima i izvršava dobiveni program s tim argumentima. Zato > dolazi kao doslovni argument, a | se predaje programu umjesto da poveže dva procesa. Jedinica se ne ponaša pogrešno; sintaksa je značila nešto drugo.

To je namjerno, a ne nemarno, jer predvidivo rukovanje argumentima čini jedinice provjerljivima. Iznenađuje samo one koji pretpostavljaju da je shell prisutan.

Napišite jedinicu koja točno kaže što se pokreće

Počnite s malom jedinicom čija je svrha vidljiva u dnevniku, kako bi problemi raščlambe ostali odvojeni od problema tunela. Ova samo prijavljuje verziju binarne datoteke.

[Unit]
Description=Report the installed OpenVPN version

[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journal

Putanja je zamjenski tekst, pa je zamijenite binarnom datotekom koja je stvarno instalirana. Type=oneshot odgovara naredbi koja radi do završetka, a postavke dnevnika stavljaju njezin izlaz tamo gdje ga možete pročitati bez terminala. Namjerno nema odjeljka za instalaciju, pa se jedinica poziva ručno umjesto da se omogući pri podizanju sustava. Provjerite datoteku prije pokretanja, jer tipfeler u nazivu direktive pada drukčije od tipfelera u putanji.

systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.service

Zadržite shell logiku u skripti

Kad pomoćniku doista treba uvjetna logika, stavite tu logiku u skriptu i pozovite je izričito. Skripti trebaju interpreterski redak, dopuštenje za izvršavanje i izlazni kodovi koje usluga može prijaviti. Pokretanje /bin/sh -c s naredbom pod navodnicima doista radi, ali skriva pravila navođenja unutar jedinice i otežava pregled. Imenovana skripta može se ručno testirati i kasnije zamijeniti bez uređivanja jedinice. Ne oslanjajte se na profil shell-a interaktivnog korisnika, jer usluga kreće s vlastitim okruženjem.

Postavite WorkingDirectory kad su relativne putanje važne, a okruženje prosljeđujte podržanim direktivama jedinice umjesto da ga izvezete u terminalu. Tajne pripadaju zaštićenim datotekama ili vjerodajnicama, a ne popisima argumenata koje dnevnik može zabilježiti.

Provjerite jedinicu koja stvarno postoji

Drop-in datoteke mijenjaju ponašanje bez diranja datoteke koju se sjećate da ste uređivali. Pročitajte što je upravitelj učitao i što je prijavilo posljednje pokretanje.

systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pager

Ispis jedinice uključuje drop-in datoteke u redoslijedu učitavanja i upravo odatle obično dolazi neočekivani ExecStart. Nakon svake promjene ponovno učitajte upravitelj i potvrdite da je nova definicija ono što ispisuje systemctl cat. Dnevnik pokazuje točan naredbeni redak i izlazni status, što odvaja problem s argumentima od nedostajuće binarne datoteke ili pogreške s dopuštenjima. Zatim odlučite pripada li pomoćnik postojećem životnom ciklusu VPN-a ili treba ostati ručna dijagnostika, jer drugi pozadinski proces tunela stvara konkurentnog vlasnika.

Jedinica koja na zahtjev ispisuje točan izlaz dobar je prvi korak. Još nije tunel i ne bi se trebala pretvarati da jest.

Povezani članci