ExecStart ne estas ŝelo: ripari VPN-helpan uniton
ExecStart rulas programon kun argumentoj, ne ŝelan tubaron. Uzu eksplicitan interpretilon aŭ veran skripton, poste kontrolu la uniton kaj legu la ĵurnalon.
Kopiu funkciantan komandlinion en ExecStart, reŝargu, kaj la unuo malsukcesas aŭ finiĝas silente, ĉar la argumentoj estas traktataj kiel dosiernomoj. Nenio estas rompita en systemd. ExecStart estas argumenta listo, ne ŝelo, do tuboj, alidirektado kaj kondiĉoj perdas sian signifon tuj kiam ili forlasas vian terminalon. Decidu, kie la ŝelo apartenas, poste skribu uniton, kiu diras precize, kio devas esti plenumita.
Kial la tubaro en ExecStart faras nenion
Kiam komando estas tajpita en terminalo, la ŝelo unue analizas ĝin. Ĝi konstruas tubaron, malfermas dosierojn por alidirektado kaj etendas variablojn antaŭ ol iu ajn programo ekfunkcias. systemd faras nenion el tio: ĝi dividas ExecStart laŭ siaj propraj reguloj kaj plenumas la rezultan programon kun tiuj argumentoj. Tial > alvenas kiel laŭlitera argumento, kaj | estas transdonata al la programo anstataŭ konekti du procezojn. La unuo ne miskondutas; la sintakso celis ion alian.
Tio estas intenca, ne neglekta, ĉar antaŭvidebla traktado de argumentoj igas unuojn facile kontroleblaj. Ĝi surprizas nur tiujn, kiuj supozas, ke ŝelo ĉeestas.
Skribu uniton, kiu diras precize, kio ruliĝas
Komencu per malgranda unuo, kies celo videblas en la ĵurnalo, por ke analizaj problemoj restu apartaj de tunelaj problemoj. Ĉi tiu nur raportas version de duuma dosiero.
[Unit]
Description=Report the installed OpenVPN version
[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journalLa vojo estas anstataŭigilo, do anstataŭigu ĝin per la duuma programo, kiu efektive estas instalita. Type=oneshot taŭgas por komando, kiu ruliĝas ĝis fino, kaj la ĵurnalaj agordoj metas ĝian eligon tie, kie vi povas legi ĝin sen terminalo. Intence ne estas instalada sekcio, do la unuo estas vokata permane anstataŭ ebligita ĉe lanĉo. Kontrolu la dosieron antaŭ ol starti ĝin, ĉar tajperaro en nomo de direktivo malsukcesas alie ol tajperaro en la vojo.
systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.serviceTenu ŝelan logikon en skripto
Kiam helpilo vere bezonas kondiĉan logikon, metu tiun logikon en skripton kaj voku ĝin eksplicite. La skripto bezonas interpretilan linion, plenumrajton kaj elirkodojn, kiujn la servo povas raporti. Lanĉi /bin/sh -c kun citita komando ja funkcias, sed ĝi kaŝas citsignajn regulojn ene de unuo kaj malfaciligas revizion. Nomita skripto povas esti testita permane kaj poste anstataŭigita sen redakti la uniton. Ne fidu la ŝelan profilon de la interaga uzanto, ĉar servo ekfunkcias kun sia propra medio.
Agordu WorkingDirectory, kiam relativaj vojoj gravas, kaj pasigu la medion per la subtenataj direktivoj de la unuo anstataŭ eksporti ĝin en terminalo. Sekretoj apartenas al protektitaj dosieroj aŭ akreditiloj, ne al argumentaj listoj, kiujn la ĵurnalo povas registri.
Kontrolu la uniton, kiu efektive ekzistas
Drop-in dosieroj ŝanĝas konduton sen tuŝi la dosieron, kiun vi memoras redakti. Legu, kion la administrilo ŝargis kaj kion raportis la lasta rulo.
systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pagerLa unita elprenaĵo inkluzivas drop-in dosierojn laŭ ŝarĝa ordo, kaj de tie kutime venas neatendita ExecStart. Post ĉiu ŝanĝo reŝargu la administrilon kaj konfirmu, ke la nova difino estas tio, kion presas systemctl cat. La ĵurnalo montras la precizan komandlinion kaj elirstatuson, kio apartigas argumentan problemon de mankanta duumaĵo aŭ permesa eraro. Poste decidu, ĉu la helpilo apartenas al la ekzistanta VPN-ciklo aŭ devus resti permana diagnozo, ĉar dua fona tunela procezo kreas konkurantan posedanton.
Unuo, kiu presas la ĝustan eligon laŭpete, estas bona unua mejloŝtono. Ĝi ankoraŭ ne estas tunelo, kaj ĝi ne devus ŝajnigi esti tia.