Ddoe roedd y twnnel yn gweithio, a’r bore yma mae’r unit yn farw gyda Failed at step EXEC spawning /usr/local/bin/vpnclient yn y journal. Nid yw’r manylion mewngofnodi, y llwybrau na’r cyfrif byth yn mynd i mewn i’r frawddeg honno. Datryswyd ExecStart i lwybr gan systemd, gofynnodd i’r kernel ei weithredu, a gwrthododd y kernel, yn fwyaf aml oherwydd nad oes dim yn bodoli ar y llwybr hwnnw neu nad yw’r ffeil yn weithredadwy. Triniwch y diffyg fel problem ffeil ac argv nes bod y gorchymyn a ddadansoddwyd yn profi fel arall.

Pam mae EXEC yn methu cyn i’r dilysiad ddechrau

Nid yw systemd yn rhedeg ExecStart drwy shell. Mae’n gwneud fork, yn adeiladu fector dadleuon o’r llinell ac yn galw execve ar yr elfen gyntaf. Os bydd y galwad honno’n methu, ni fydd y gwasanaeth byth yn cyrraedd cod ei hun y cleient VPN, felly ni all unrhyw olygu proffil na gwirio manylion mewngofnodi helpu.

Mae’r cod statws yn gwahanu’r teulu hwn oddi wrth ddamweiniau cyffredin. Nid yw unit sy’n gadael gyda status=203/EXEC erioed wedi dechrau proses; gall unit sy’n cychwyn ac yna’n gadael gyda status=1 fod wedi methu yn y dilysiad, yn y DNS neu yn y llwybrau. Darllenwch y cod cyn log y cleient, oherwydd yn yr achos cyntaf bydd log y cleient yn wag.

Y llwybr yn y journal yw’r un a ddefnyddiwyd gan systemd, ac nid yw o reidrwydd yr un a olygwyd gennych. Gall ffeiliau drop-in ac allbwn y generadur ddisodli ffeil y gwerthwr, ac mae daemon-reload hen yn gadael yr hen linell yn y cof. Dyna pam mai’r diagnosis cyntaf yw gofyn i systemd beth yw’r gorchymyn yn ei farn ef, yn hytrach nag agor y ffeil rydych yn cofio ei newid.

Tri lle y mae llwybr y binary yn cael ei ysgrifennu

Gall cleient VPN a osodwyd o becyn dosbarthu, sgript gwerthwr a tarball rhyddhau lanio mewn tri rhagddodiad gwahanol. Cofnododd yr unit, y rheol braint a’r gosodwr un o’r rhagddodiadau hynny, a’r diffyg sy’n ymddangos pan nad yw dau o’r tri yn cytuno.

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/

Mae anghysondeb pendant yn edrych fel hyn: mae sgript y gwerthwr yn gosod i /usr/local/bin, mae’r tarball wedi’i ddadbacio o dan /opt, ac mae’r unit yn dal i enwi’r hen lwybr /usr/bin o becyn blaenorol. Dim ond un o’r ffeiliau hynny sy’n bodoli, a phrin mai dyna’r un yn ExecStart.

Penderfynwch pa lwybr sy’n ganonaidd cyn newid y naill ffeil neu’r llall. Os y pecyn dosbarthu sy’n berchen ar y binary, y llwybr pecyn sy’n ganonaidd a dylai’r unit ei ddilyn. Os yw sgript y gwerthwr yn berchen arno, mae’r un rheol yn berthnasol i ragddodiad y gwerthwr. Mae copïo binary rhwng rhagddodiadau yn creu dwy gopi sy’n gwahanu yn yr uwchraddiad nesaf.

Pan fo gorchymyn mewn dyfynbris yn dod yn enw ffeil

Mae ail fodd methiant yn cuddio y tu ôl i’r un llinell journal. Mae rhywun yn ysgrifennu hyn yn yr unit ac yn disgwyl i’r cleient gysylltu yn ystod y cychwyn:

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

Mae systemd yn rhannu’r gwerth yn eiriau, felly daw’r gair cyntaf yn /usr/bin/vpnclient connect office gyda’r dyfynbrisiau wedi’u tynnu fel cystrawen grwpio. Yna mae’r kernel yn chwilio am ffeil y mae ganddi fylchau yn ei henw, ac nid oes y fath ffeil. Mae’r gwall yn union yr un fath ag un binary coll, er bod y binary wedi’i osod.

Y ffurf a gefnogir yw gweithredadwy go iawn wedi’i ddilyn gan ddadleuon ar wahân, er enghraifft ExecStart=/usr/bin/vpnclient connect office. Os oes gwir angen pibell neu gadwyn ar y llif gwaith, rhowch hi mewn sgript a galwch y sgript, oherwydd nid oes gan ExecStart &&, nac unrhyw bibell, nac ehangu glob.

Trwsiwch yr unit, nid y system ffeiliau

Y trwsio temptasiwn yw cysylltiad symbolaidd o’r llwybr disgwyliedig i’r binary go iawn. Mae’n gweithio nes bod y pecyn yn diweddaru ac mae’r cysylltiad yn pwyntio at ffeil a dynnwyd, neu nes nad yw label SELinux yn cyfateb i’r targed mwyach. Gwell yw golygu’r unit drwy drop-in fel bod ffeil y gwerthwr yn aros yn gyfan ac mae’r uwchraddiadau yn aros yn ragweladwy.

Rhaid i’r rheol braint gyfateb i’r un llwybr a’r un is-orchmynion. Nid yw cofnod sudoers ar gyfer /usr/local/bin/vpnclient yn awdurdodi /usr/bin/vpnclient, ac mae cofnod sy’n caniatáu pob dadl yn gadael i unrhyw broses leol ailgyflunio neu atal y twnnel. Rhowch y ddau ferf sydd eu hangen ar yr unit a chadwch y datgymalu allan ohoni os yw atal y gwasanaeth eisoes yn cau’r rhyngwyneb.

Dyma lle mae’r gymhariaeth yn talu: dylai’r unit, cronfa ddata’r pecynnau a sudoers i gyd enwi un llwybr. Pan fyddant yn gwneud hynny, mae’r gwall EXEC yn diflannu heb ailgychwyn a heb gopi o’r binary mewn trydydd lle.

Profwch y gorchymyn a ddadansoddwyd cyn ailgychwyn

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 yw’r allbwn penderfynol oherwydd ei fod yn argraffu’r argv a ddadansoddodd systemd mewn gwirionedd, gan gynnwys unrhyw drop-in. Mae systemd-analyze verify yn dal llwybr coll neu anweithredadwy cyn i chi ailgychwyn, ac mae’r gorchymyn statws ar ôl ailgychwyn yn dweud a yw’r broses yn bodoli nawr.

Os yw’r unit yn cychwyn ac yna’n methu, rydych wedi gadael teulu EXEC ac wedi mynd i mewn i drin gwallau’r cleient ei hun. Edrychwch yn y journal am neges y cleient, nid am fethiant execve arall. Cadwch ddiff yr unit a diff sudoers gyda’i gilydd yn y cofnod newid fel nad yw’r uwchraddiad nesaf yn ailgyflwyno’r llwybr hollt yn dawel.

Erthyglau cysylltiedig