Kopeerige töötav käsurida ExecStarti, laadige uuesti ja üksus ebaõnnestub või väljub vaikselt, sest argumente käsitletakse failinimedena. systemd-is pole midagi katki. ExecStart on argumentide loend, mitte shell, seega torud, ümbersuunamine ja tingimused kaotavad mõtte hetkel, kui need teie terminalist lahkuvad. Otsustage, kuhu shell kuulub, ja kirjutage seejärel üksus, mis ütleb täpselt, mida käivitada.

Miks toru ExecStartis midagi ei tee

Kui käsk terminali trükitakse, sõelub shell selle esimesena. See ehitab toru, avab failid ümbersuunamiseks ja laiendab muutujaid enne, kui ükski programm algab. systemd ei tee midagi sellest: see jaotab ExecStarti oma reeglite järgi ja käivitab tulemuseks oleva programmi nende argumentidega. Seetõttu saabub > sõnasõnalise argumendina ja | antakse programmile edasi, selle asemel et ühendada kaks protsessi. Üksus ei käitu valesti; süntaks tähendas midagi muud.

See on tahtlik, mitte lohakas, sest etteaimatav argumentide käsitlemine teeb üksused auditeeritavaks. See üllatab vaid neid, kes eeldavad, et shell on olemas.

Kirjutage üksus, mis ütleb täpselt, mis töötab

Alustage väikesest üksusest, mille eesmärk on žurnaalis nähtav, et sõelumisprobleemid jääksid tunneliprobleemidest eraldi. See teatab ainult binaarfaili versiooni.

[Unit]
Description=Report the installed OpenVPN version

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

Tee on kohatäide, seega asendage see binaarfailiga, mis on tegelikult paigaldatud. Type=oneshot sobib käsule, mis töötab lõpuni, ja žurnaali seaded panevad selle väljundi sinna, kus saate seda terminali jätta. Paigaldusjaotis puudub tahtlikult, seega kutsutakse üksust käsitsi, mitte ei lubata käivitamisel. Valideerige fail enne käivitamist, sest trükiviga direktiivi nimes ebaõnnestub teisiti kui viga teel.

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

Hoidke shelli loogika skriptis

Kui abil on tõesti vaja tingimuslikku loogikat, pange see loogika skripti ja kutsuge seda selgesõnaliselt. Skript vajab interpretaatori rida, käivitusluba ja väljumiskoode, mida teenus saab teatada. Käivitamine /bin/sh -c jutumärkides käsuga töötab, kuid peidab jutumärkide reeglid üksuse sisse ja raskendab ülevaatamist. Nimega skripti saab käsitsi testida ja hiljem välja vahetada ilma üksust muutmata. Ärge toetuge interaktiivse kasutaja shelli profiilile, sest teenus algab oma keskkonnaga.

Määrake WorkingDirectory, kui suhtelised teed on olulised, ja edastage keskkond üksuse toetatud direktiivide kaudu, selle asemel et seda terminalis eksportida. Saladused kuuluvad kaitstud failidesse või mandaatidesse, mitte argumentide loenditesse, mille žurnaal võib salvestada.

Kontrollige üksust, mis tegelikult olemas on

Drop-in failid muudavad käitumist ilma puudutamata faili, mida mäletate muutvat. Lugege, mida haldur laadis ja mida viimane käivitus teatas.

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

Üksuse väljund sisaldab drop-in faile laadimisjärjekorras ja tavaliselt tuleb ootamatu ExecStart just sealt. Pärast iga muudatust laadige haldur uuesti ja kinnitage, et uus määratlus on see, mida trükib systemctl cat. Žurnaal näitab täpset käsurida ja väljumisolekut, mis eraldab argumentide probleemi puuduvast binaarfailist või õiguste veast. Seejärel otsustage, kas abi kuulub olemasolevasse VPN-i elutsüklisse või peaks jääma käsitsi diagnoosiks, sest teine taustaprotsess tunnelina loob konkureeriva omaniku.

Üksus, mis trükib nõudmisel õige väljundi, on hea esimene verstapost. See pole veel tunnel ja ei tohiks teeselda, et on.

Seotud artiklid