Kopieer ’n werkende opdragreël in ExecStart, herlaai, en die eenheid misluk of stop stil omdat die argumente as lêername behandel word. Niks is fout in systemd nie. ExecStart is ’n argumentlys, nie ’n skulp nie, so pype, herleiding en voorwaardes verloor hul betekenis sodra hulle jou terminale verlaat. Besluit waar die skulp hoort, en skryf dan ’n eenheid wat presies sê wat uitgevoer moet word.

Waarom die pyplyn in ExecStart niks doen nie

Wanneer ’n opdrag in ’n terminale getik word, ontleed die skulp dit eerste. Dit bou ’n pyplyn, maak lêers oop vir herleiding en brei veranderlikes uit voordat enige program begin. systemd doen niks daarvan nie: dit verdeel ExecStart volgens sy eie reëls en voer die resulterende program met daardie argumente uit. ’n > kom dus as ’n letterlike argument aan, en ’n | word aan die program oorhandig in plaas daarvan om twee prosesse te verbind. Die eenheid gedra hom nie verkeerd nie; die sintaksis het iets anders bedoel.

Dit is doelbewus eerder as sorgeloos, want voorspelbare hantering van argumente is wat eenhede kontroleerbaar maak. Dit verras net mense wat aanneem ’n skulp is teenwoordig.

Skryf ’n eenheid wat presies sê wat loop

Begin met ’n klein eenheid wie se doel in die joernaal sigbaar is, sodat ontledingsprobleme apart van tonnelprobleme bly. Hierdie een rapporteer net ’n binêre weergawe.

[Unit]
Description=Report the installed OpenVPN version

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

Die pad is ’n plekhouer, so vervang dit met die binêre lêer wat werklik geïnstalleer is. Type=oneshot pas by ’n opdrag wat tot voltooiing loop, en die joernaalinstellings plaas die uitvoer waar jy dit sonder ’n terminale kan lees. Daar is doelbewus geen installasie-afdeling nie, so die eenheid word met die hand opgeroep eerder as om by selflaai geaktiveer te word. Verifieer die lêer voordat jy dit begin, want ’n tikfout in ’n aanwysingsnaam misluk anders as ’n tikfout in die pad.

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

Hou skulp-logika in ’n skrip

Wanneer ’n hulpdiens werklik voorwaardelike logika nodig het, plaas daardie logika in ’n skrip en roep dit eksplisiet. Die skrip benodig ’n tolk-reël, uitvoerbare toestemming en uittreekodes wat die diens kan rapporteer. Om /bin/sh -c saam met ’n aangehaalde opdrag te begin, werk wel, maar dit versteek aanhalingreëls binne ’n eenheid en maak hersiening moeiliker. ’n Benoemde skrip kan met die hand getoets word en later vervang word sonder om die eenheid te wysig. Moenie op die interaktiewe gebruiker se skulp-profiel staatmaak nie, want ’n diens begin met sy eie omgewing.

Stel WorkingDirectory in wanneer relatiewe paaie saak maak, en gee omgewing deur die eenheid se ondersteunde aanwysings deur eerder as om dit in ’n terminale uit te voer. Geheime hoort in beskermde lêers of geloofsbriewe, nie in argumentlyste wat die joernaal kan opteken nie.

Kyk na die eenheid wat werklik bestaan

Drop-ins verander gedrag sonder om die lêer te raak wat jy onthou jy gewysig het. Lees wat die bestuurder gelaai het en wat die laaste lopie gerapporteer het.

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

Die eenheid-uitstoot sluit drop-ins in laaivolgorde in, en dit is gewoonlik waar ’n onverwagte ExecStart vandaan kom. Herlaai na enige wysiging die bestuurder en bevestig dat die nuwe definisie is wat systemctl cat druk. Die joernaal wys die presiese opdragreël en uittreestatus, wat ’n argumentprobleem skei van ’n ontbrekende binêre lêer of ’n toestemmingsfout. Besluit dan of die hulpdiens by die bestaande VPN-lewensiklus hoort of ’n handmatige diagnostikum moet bly, want ’n tweede agtergrond-tonnelproses skep ’n mededingende eienaar.

’n Eenheid wat die regte uitvoer op aanvraag druk, is ’n goeie eerste mylpaal. Dit is nog nie ’n tonnel nie, en dit moet nie voorgee dat dit een is nie.

Verwante artikels