Kopier ei fungerande kommandolinje inn i ExecStart, last inn på nytt, og eininga feilar eller avsluttar stille fordi argumenta blir handsama som filnamn. Ingenting er øydelagt i systemd. ExecStart er ei argumentliste, ikkje eit skal, så røyr, omdirigering og vilkår mistar meininga i det augeblikket dei forlèt terminalen din. Bestem kvar skalet høyrer heime, og skriv deretter ei eining som seier nøyaktig kva som skal køyrast.

Kvifor røyret i ExecStart ikkje gjer noko

Når ein kommando blir skriven i ein terminal, parsar skalet han først. Det byggjer eit røyr, opnar filer for omdirigering og utvidar variablar før noko program startar. systemd gjer ingenting av dette: det deler ExecStart etter sine eigne reglar og køyrer programmet som blir resultatet med dei argumenta. Difor kjem > som eit bokstaveleg argument, og eit | blir gitt vidare til programmet i staden for å kople to prosessar. Eininga oppfører seg ikkje feil; syntaksen meinte noko anna.

Det er med vilje og ikkje slurv, fordi føreseieleg argumenthandsaming er det som gjer einingar reviderbare. Det overraskar berre dei som tek for gitt at det finst eit skal.

Skriv ei eining som seier nøyaktig kva som blir køyrt

Byrj med ei lita eining der formålet er synleg i journalen, slik at parseproblem held seg åtskilde frå tunnelproblem. Denne rapporterer berre versjonen til ei binærfil.

[Unit]
Description=Report the installed OpenVPN version

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

Stien er ein plasshaldar, så byt han ut med binærfilen som faktisk er installert. Type=oneshot passar for ein kommando som køyrer til fullføring, og journalinnstillingane legg utdataa der du kan lese dei utan terminal. Det er med vilje inga installasjonsseksjon, så eininga blir kalla opp for hand i staden for å bli aktivert ved oppstart. Valider fila før du startar ho, fordi ein skrivefeil i eit direktivnamn feilar annleis enn ein skrivefeil i stien.

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

Hald skal-logikk i eit skript

Når ein hjelpar verkeleg treng vilkårslogikk, legg den logikken i eit skript og kall det eksplisitt. Skriptet treng ei tolkelinje, køyreløyve og utgangskodar som tenesta kan rapportere. Å starte /bin/sh -c med ein kommando i hermeteikn verkar, men det gøymer hermeteiknreglar inne i ei eining og gjer gjennomgangen vanskelegare. Eit namngitt skript kan testast for hand og bytast ut seinare utan å endre eininga. Ikkje stol på skalprofilen til den interaktive brukaren, fordi ei teneste startar med sitt eige miljø.

Set WorkingDirectory når relative stiar betyr noko, og send miljøet vidare gjennom dei støtta direktiva til eininga i staden for å eksportere det i ein terminal. Løyndomar høyrer heime i verna filer eller legitimasjon, ikkje i argumentlister som journalen kan registrere.

Kontroller eininga som faktisk finst

Drop-in-filer endrar åtferd utan å røre fila du hugsar at du redigerte. Les kva behandlaren lasta inn og kva den siste køyringa rapporterte.

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

Einingsutskrifta inneheld drop-in-filer i laste-rekkjefølgje, og det er vanlegvis der ein uventa ExecStart kjem frå. Etter kvar endring, last behandlaren på nytt og stadfest at den nye definisjonen er det som systemctl cat skriv ut. Journalen viser den nøyaktige kommandolinja og utgangsstatusen, noko som skil eit argumentproblem frå ei manglande binærfil eller ein løyvefeil. Bestem deretter om hjelparen høyrer til den eksisterande VPN-livssyklusen eller bør vere ein manuell diagnose, fordi ein annan bakgrunnstunnelprosess skapar ein konkurrerande eigar.

Ei eining som skriv ut rett utdata på førespurnad, er ein god første milepæl. Ho er enno ikkje ein tunnel, og ho bør ikkje late som ho er det.

Relaterte artiklar