Eile töötas tunnel, ja täna hommikul on unit surnud, žurnaalis on Failed at step EXEC spawning /usr/local/bin/vpnclient. Õigused, marsruudid ja konto ei esine selles lauses kunagi. systemd tegi ExecStartist raja, palus tuumal see käivitada ja tuum keeldus, enamasti sellepärast, et sellel rajal pole midagi või fail ei ole käivitatav. Käsitlege tõrget faili ja argumendivektori probleemina, kuni parsimisega saadud käsk tõestab vastupidist.

Miks EXEC nurjub enne, kui autentimine algab

systemd ei käivita ExecStarti shelli kaudu. Ta teeb forgi, koostab realt argumentvektori ja kutsub esimese elemendi peal välja execve. Kui see väljakutse nurjub, ei jõua teenus kunagi VPN-kliendi enda koodini, nii et profiili muutmine ega õiguste kontrollimine ei aita.

Olekukood eristab seda perekonda tavalistest krahhidest. Unit, mis väljub status=203/EXEC-iga, ei käivitanud kunagi protsessi; unit, mis käivitub ja seejärel väljub status=1 -iga, võis nurjuda autentimisel, DNS-is või marsruutimisel. Lugege koodi enne kliendi logi, sest esimesel juhul jääb kliendi logi tühjaks.

Žurnaalis olev rada on see, mida systemd kasutas, mitte tingimata see, mida te muutsite. Drop-in failid ja generaatori väljund võivad tarnija faili üle kirjutada ning aegunud daemon-reload jätab vana rea mällu. Seetõttu on esimene diagnostika küsida systemdilt, mida ta käsuks peab, mitte avada faili, mille muutmise mäletate.

Kolm kohta, kuhu binaarfaili rada on kirja pandud

Jaotuspaketist, tarnija skriptist ja väljalaske tarballist paigaldatud VPN-klient võib sattuda kolme erinevasse prefiksisse. Unit, õiguste reegel ja paigaldaja märkisid igaüks ühe neist prefiksitest ning tõrge ilmneb siis, kui kaks kolmest ei klapi.

RecordCommon valueHow to read it
Unit or drop-in/usr/local/bin/vpnclientsystemctl cat vpnclient.service
Installed binary/usr/bin/vpnclientcommand -v vpnclient, then ls -l the result
Sudoers grant/opt/vpnclient/bin/vpnclientsudo grep -r vpnclient /etc/sudoers.d/

Konkreetne lahknevus näeb välja nii: tarnija skript paigaldab asukohta /usr/local/bin, tarball pakiti lahti /opt all ja unit nimetab endiselt vana /usr/bin rada eelmisest paketist. Neist failidest on olemas ainult üks ja harva on see seesama, mis ExecStartis.

Otsustage, milline rada on kanooniline, enne kui kumbagi faili muudate. Kui binaarfail kuulub jaotuspaketile, on paketi rada kanooniline ja unit peab sellele järgnema. Kui see kuulub tarnija skriptile, kehtib sama reegel tarnija prefiksi kohta. Binaarfaili prefiksite vahel kopeerimine loob kaks koopiat, mis järgmisel uuendusel lahku lähevad.

Kui jutumärkides käsk saab failinimeks

Teine tõrkerežiim peidab end sama žurnaali rea taga. Keegi kirjutab selle unitisse ja eeldab, et klient ühendub alglaadimise ajal:

ExecStart=/usr/bin/"vpnclient connect office"

systemd jagab väärtuse sõnadeks, nii et esimene sõna saab /usr/bin/vpnclient connect office, kusjuures jutumärgid eemaldatakse rühmitamise süntaksina. Seejärel otsib tuum faili, mille nimes on tühikud, ja sellist ei ole. Viga on identne puuduva binaarfailiga, kuigi binaarfail on paigaldatud.

Toetatud vorm on tõeline käivitatav fail, millele järgnevad eraldi argumendid, näiteks ExecStart=/usr/bin/vpnclient connect office. Kui töövoog vajab tõesti toru või ahelat, pange see skripti ja kutsuge skripti, sest ExecStartil pole &&, pole torusid ja pole glob-laiendust.

Parandage unitit, mitte failisüsteemi

Ahvatlev parandus on sümboolne link oodatud rajalt tõelisele binaarfailile. See töötab seni, kuni pakett uueneb ja link osutab eemaldatud failile, või kuni SELinuxi silt ei vasta enam sihtmärgile. Eelistage uniti muutmist drop-ini kaudu, et tarnija fail jääks puutumata ja uuendused püsiksid ettearvatavad.

Õiguste reegel peab vastama samale rajale ja samadele alamkäskudele. sudoersi kirje /usr/local/bin/vpnclient jaoks ei volita /usr/bin/vpnclient ning kirje, mis lubab iga argumenti, laseb igal kohalikul protsessil tunneli ümber seadistada või peatada. Andke kaks tegusõna, mida unit vajab, ja hoidke lammutamine sellest väljas, kui teenuse peatamine sulgeb liidese juba niikuinii.

Siin tasub võrdlemine end ära: unit, paketiandmebaas ja sudoers peaksid kõik nimetama üht rada. Kui nad seda teevad, kaob EXEC-i viga ilma taaskäivituseta ja ilma binaarfaili koopiata kolmandas kohas.

Tõestage parsitud käsk enne taaskäivitust

sudo systemctl daemon-reload
sudo systemctl cat vpnclient.service
systemctl show -p ExecStart vpnclient.service
systemd-analyze verify /etc/systemd/system/vpnclient.service
sudo systemctl restart vpnclient.service
systemctl status vpnclient.service --no-pager

systemctl show on otsustav väljund, sest see trükib argv, mille systemd tegelikult parsisi, sealhulgas iga drop-ini. systemd-analyze verify püüab kinni puuduva või mittekäivitatava raja enne taaskäivitust ning olekukäsk taaskäivituse järel ütleb, kas protsess on nüüd olemas.

Kui unit käivitub ja seejärel nurjub, olete EXEC-i perekonnast lahkunud ja sisenenud kliendi enda vigade käsitlusse. Otsige žurnaalis kliendi sõnumit, mitte järjekordset execve tõrget. Hoidke uniti diff ja sudoersi diff koos muudatuste kirjes, et järgmine uuendus ei taastaks vaikselt lõhestatud rada.

Seotud artiklid