Kopéiert eng funktionéierend Kommandozeil an ExecStart, lued nei, an d’Unit feelt oder hält stëll op, well d’Argumenter als Dateinimm behandelt ginn. An systemd ass näischt futti. ExecStart ass eng Argumentlëscht, keng Shell, dofir verléieren Pipe, Ëmleedung a Konditioune hire Sënn, soubal se den Terminal verloossen. Entscheet, wou d’Shell hiergehéiert, a schreift dann eng Unit, déi genee seet, wat ausgefouert soll ginn.

Firwat d’Pipeline an ExecStart näischt mécht

Wann eng Kommando an engem Terminal getippt gëtt, parst d’Shell se fir d’éischt. Si baut eng Pipeline, mécht Dateien fir d’Ëmleedung op a breet Variabelen aus, ier iergendeen Programm ufänkt. systemd mécht näischt dovun: et deelt ExecStart no sengen eegene Reegelen an ausféiert de Programm, deen dobäi erauskënnt, mat dësen Argumenter. Dofir kënnt > als literalen Argument un, an eng | gëtt un de Programm iwwerginn, amplaz zwou Prozesser ze verbannen. D’Unit verhält sech net falsch; d’Syntax huet eppes anescht gemengt.

Dat ass bewosst a net fahrlässeg, well eng viraussobar Behandlung vun Argumenter d’Uniten auditabel mécht. Et iwwerrascht just déi, déi unhuelen, et géif eng Shell do sinn.

Schreift eng Unit, déi genee seet, wat leeft

Fänkt mat enger klenger Unit un, där hire Zweck am Journal ze gesinn ass, sou datt Parsingproblemer getrennt vun Tunnelproblemer bleiwen. Dës mellt just d’Versioun vun engem Binär.

[Unit]
Description=Report the installed OpenVPN version

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

De Pad ass en Platzhalter, ersetzt en also duerch de Binär, deen tatsächlech installéiert ass. Type=oneshot passt bei eng Kommando, déi bis zum Schluss leeft, an d’Journalastellungen setzen hir Ausgab dohin, wou Dir se ouni Terminal liese kënnt. Et gëtt bewosst keng Installatiounssektioun, dofir gëtt d’Unit vun Hand opgeruff, amplaz beim Start aktivéiert ze ginn. Validéiert d’Datei, ier Dir se start, well en Tippfeeler am Numm vun enger Direktiv anescht feelt wéi en Tippfeeler am Pad.

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

Halt d’Shell-Logik an engem Skript

Wann en Hëllef wierklech konditional Logik brauch, setzt déi Logik an e Skript a rufft en explizit op. D’Skript brauch eng Interpreterzeil, Ausféierungsrecht an Exit-Coden, déi de Service ka mellen. D’Starte vun /bin/sh -c mat enger Kommando a Quotes funktionéiert, awer et verstoppt d’Quote-Regelen an enger Unit a mécht d’Iwwerpréiwung méi schwéier. En genannt Skript ka vun Hand getest a méi spéit ersat ginn, ouni d’Unit z’änneren. Verloosst Iech net op de Shell-Profil vum interaktiven Notzer, well e Service mat sengem eegene Ëmfeld start.

Setzt WorkingDirectory wann relativ Pade wichteg sinn, a gitt d’Ëmfeld iwwer déi ënnerstëtzt Direktive vun der Unit weider, amplaz et an engem Terminal ze exportéieren. Geheimnisser gehéieren a geschützte Dateien oder an Umeldungsdaten, net an Argumentlëschten, déi de Journal kéint opzeechnen.

Préift d’Unit, déi tatsächlech existéiert

Drop-in-Dateien änneren d’Verhalen, ouni déi Datei ze beréieren, déi Dir Iech erënnert hutt ze änneren. Liest, wat de Manager gelueden huet a wat de leschte Laf gemellt huet.

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

Den Unit-Dump enthält Drop-in-Dateien a Lueduerdnung, an dohier kënnt meeschtens en onerwaarten ExecStart. Lued nom all Ännerung de Manager nei a bestätegt, datt déi nei Definitioun dat ass, wat systemctl cat dréckt. De Journal weist déi genee Kommandozeil an den Exit-Status, wat en Argumentproblem vun engem fehlende Binär oder engem Berechtegungsfehler trennt. Entscheet duerno, ob den Hëllef zum bestehende VPN-Liewenszyklus gehéiert oder eng manuell Diagnos bleiwe soll, well en zweete Tunnelprozess am Hannergrond en konkurréierende Besëtzer schaafft.

Eng Unit, déi op Ufro déi richteg Ausgab dréckt, ass en gudde éischte Meilesteen. Si ass nach keen Tunnel a soll net sou dinn, wéi wann se ee wier.

Ähnlech Artikelen