Nokopējiet strādājošu komandrindu ExecStart, pārlādējiet, un vienība cieš neveiksmi vai beidzas klusi, jo argumenti tiek uzskatīti par failu nosaukumiem. systemd nekas nav salūzis. ExecStart ir argumentu saraksts, nevis shell, tāpēc caurules, novirzīšana un nosacījumi zaudē nozīmi mirklī, kad tie atstāj jūsu termināli. Izlemiet, kur pieder shell, pēc tam uzrakstiet vienību, kas precīzi pasaka, kas jāizpilda.

Kāpēc caurule ExecStart neko nedara

Kad komanda tiek ierakstīta terminālī, shell to vispirms parsē. Tā veido cauruli, atver failus novirzīšanai un paplašina mainīgos pirms jebkuras programmas starta. systemd neko no tā nedara: tas sadala ExecStart pēc saviem noteikumiem un izpilda iegūto programmu ar šiem argumentiem. Tāpēc > ierodas kā burtisks arguments, un | tiek nodots programmai, nevis savieno divus procesus. Vienība neuzvedas nepareizi; sintakse domāja ko citu.

Tas ir apzināti, nevis nolaidīgi, jo paredzama argumentu apstrāde ir tas, kas padara vienības auditējamas. Tas pārsteidz tikai tos, kuri pieņem, ka shell ir klāt.

Uzrakstiet vienību, kas precīzi pasaka, kas darbojas

Sāciet ar mazu vienību, kuras mērķis redzams žurnālā, lai parsēšanas problēmas paliktu atsevišķi no tuneļa problēmām. Šī tikai ziņo binārā faila versiju.

[Unit]
Description=Report the installed OpenVPN version

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

Ceļš ir vietturis, tāpēc aizstājiet to ar faktiski instalēto bināro failu. Type=oneshot piemērots komandai, kas darbojas līdz beigām, un žurnāla iestatījumi ievieto tās izvadi tur, kur varat to lasīt bez termināļa. Apzināti nav instalācijas sadaļas, tāpēc vienība tiek izsaukta ar roku, nevis iespējota startēšanas laikā. Pārbaudiet failu pirms tā palaišanas, jo drukas kļūda direktīvas nosaukumā cieš neveiksmi citādi nekā kļūda ceļā.

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

Turiet shell loģiku skriptā

Kad palīgam patiešām vajadzīga nosacījumu loģika, ievietojiet to skriptā un izsauciet to skaidri. Skriptam vajag interpretatora rindu, izpildes atļauju un iziešanas kodus, ko pakalpojums var ziņot. /bin/sh -c palaišana ar pēdiņās ievietotu komandu strādā, bet tā slēpj pēdiņu noteikumus vienības iekšienē un apgrūtina pārskatīšanu. Nosauktu skriptu var pārbaudīt ar roku un vēlāk aizstāt, nelabojot vienību. Nepaļaujieties uz interaktīvā lietotāja shell profilu, jo pakalpojums sākas ar savu vidi.

Iestatiet WorkingDirectory, kad relatīvie ceļi ir svarīgi, un nododiet vidi caur vienības atbalstītajām direktīvām, nevis eksportējiet to terminālī. Noslēpumi pieder aizsargātiem failiem vai akreditācijas datiem, nevis argumentu sarakstiem, ko žurnāls var ierakstīt.

Pārbaudiet vienību, kas patiešām eksistē

Drop-in faili maina uzvedību, neaizskarot failu, kuru atceraties esam labojuši. Izlasiet, ko ielādēja pārvaldnieks un ko ziņoja pēdējā palaišana.

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

Vienības izdruka ietver drop-in failus ielādes secībā, un tieši no turienes parasti nāk negaidīts ExecStart. Pēc jebkuras izmaiņas pārlādējiet pārvaldnieku un apstipriniet, ka jaunā definīcija ir tas, ko izdrukā systemctl cat. Žurnāls rāda precīzu komandrindu un iziešanas statusu, kas atdala argumentu problēmu no trūkstoša binārā faila vai atļauju kļūdas. Pēc tam izlemiet, vai palīgs pieder esošajam VPN dzīves ciklam vai tam jāpaliek manuālai diagnostikai, jo otrs fona tuneļa process rada konkurējošu īpašnieku.

Vienība, kas pēc pieprasījuma izdrukā pareizo izvadi, ir labs pirmais pavērsiens. Tā vēl nav tunelis, un tai nevajadzētu izlikties par tādu.

Saistītie raksti