Kecha tunnel ishlayotgan edi, bugun ertalab unit o'lik, jurnalda Failed at step EXEC spawning /usr/local/bin/vpnclient bor. Hisob ma'lumotlari, marshrutlar va akkaunt bu gapga hech qachon kirmaydi. systemd ExecStartni yo'lga aylantirdi, yadrodan uni bajarishni so'radi, yadro esa rad etdi, ko'pincha bu yo'lda hech narsa yo'qligi yoki fayl bajariladigan emasligi sababli. Tahlil qilingan buyruq aksini isbotlamaguncha bu nosozlikni fayl va argv muammosi deb qarang.

Nega EXEC autentifikatsiya boshlanishidan oldin muvaffaqiyatsiz bo'ladi

systemd ExecStartni shell orqali ishga tushirmaydi. U fork qiladi, satrdan argumentlar vektorini tuzadi va birinchi elementda execve chaqiradi. Agar bu chaqiruv muvaffaqiyatsiz bo'lsa, xizmat hech qachon VPN mijozi o'z kodiga yetib bormaydi, shuning uchun profilni tahrirlash yoki hisob ma'lumotlarini tekshirish yordam bermaydi.

Holat kodi bu oilani oddiy halokatlardan ajratadi. status=203/EXEC bilan chiqadigan unit hech qachon jarayon boshlamagan; boshlanib, keyin status=1 bilan chiqadigan unit autentifikatsiya, DNS yoki marshrutlashda muvaffaqiyatsiz bo'lgan bo'lishi mumkin. Mijoz jurnalini o'qishdan oldin kodni o'qing, chunki birinchi holatda mijoz jurnali bo'sh bo'ladi.

Jurnaldagi yo'l systemd ishlatgan yo'l, siz tahrirlagan yo'l bo'lishi shart emas. Drop-in fayllar va generator chiqishi sotuvchining faylini bekor qilishi mumkin, eskirgan daemon-reload esa eski satrni xotirada qoldiradi. Shuning uchun birinchi diagnostika o'zgartirganingizni eslaydigan faylni ochish emas, systemd dan buyruqni nima deb hisoblashini so'rashdir.

Ikkilik fayl yo'li yoziladigan uch joy

Tarqatma paketidan, sotuvchi skriptidan va nashr tarballidan o'rnatilgan VPN mijozi uch xil prefiksga tushishi mumkin. unit, imtiyoz qoidasi va o'rnatuvchi ulardan birini yozib qo'ygan, uchtadan ikkitasi mos kelmasa nosozlik paydo bo'ladi.

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/

Aniq nomuvofiqlik shunday ko'rinadi: sotuvchi skripti /usr/local/bin ichiga o'rnatadi, tarball /opt ostida ochilgan, unit esa hali ham oldingi paketdagi eski /usr/bin yo'lini ko'rsatadi. O'sha fayllardan faqat bittasi mavjud va bu kamdan-kam ExecStart dagi fayl bo'ladi.

Har qanday faylni o'zgartirishdan oldin qaysi yo'l kanonik ekanini hal qiling. Agar ikkilik fayl tarqatma paketiga tegishli bo'lsa, paket yo'li kanonik va unit unga ergashishi kerak. Agar sotuvchi skriptiga tegishli bo'lsa, xuddi shu qoida sotuvchi prefiksiga ham tegishli. Ikkilik faylni prefikslar orasida ko'chirish keyingi yangilanishda ajralib ketadigan ikki nusxa yaratadi.

Qo'shtirnoqdagi buyruq fayl nomiga aylanganda

Ikkinchi nosozlik rejimi xuddi shu jurnal satri orqasida yashiringan. Kimdir buni unit ga yozadi va mijoz yuklanish vaqtida ulanadi deb kutadi:

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

systemd qiymatni so'zlarga bo'ladi, shuning uchun birinchi so'z /usr/bin/vpnclient connect office bo'ladi, qo'shtirnoqlar esa guruhlash sintaksisi sifatida olib tashlanadi. Keyin yadro nomida bo'sh joy bor faylni qidiradi va bunday fayl yo'q. Ikkilik fayl o'rnatilgan bo'lsa ham xato yo'q ikkilik fayldagidek.

Qo'llab-quvvatlanadigan shakl — haqiqiy bajariladigan fayl, undan keyin alohida argumentlar, masalan ExecStart=/usr/bin/vpnclient connect office. Agar ish oqimi haqiqatan quvur yoki zanjirni talab qilsa, uni skriptga qo'ying va skriptni chaqiring, chunki ExecStart da && yo'q, quvurlar yo'q va glob kengaytmasi yo'q.

Fayl tizimini emas, unit ni tuzating

Vasvasali tuzatish kutilgan yo'ldan haqiqiy ikkilik faylga ramziy havola. U paket yangilanib, havola o'chirilgan faylni ko'rsatmaguncha yoki SELinux yorlig'i maqsadga mos kelmay qolguncha ishlaydi. unit ni drop-in orqali tahrirlash yaxshiroq, shunda sotuvchi fayli tegilmagan qoladi va yangilanishlar bashoratli bo'ladi.

Imtiyoz qoidasi xuddi shu yo'lga va xuddi shu kichik buyruqlarga mos kelishi kerak. /usr/local/bin/vpnclient uchun sudoers yozuvi /usr/bin/vpnclient ga ruxsat bermaydi, har qanday argumentga ruxsat beradigan yozuv esa har qanday lokal jarayonga tunnelni qayta sozlash yoki to'xtatish imkonini beradi. unit ga kerak bo'lgan ikki fe'lni bering va xizmatni to'xtatish interfeysni allaqachon yopsa, demontajni uning tashqarisida saqlang.

Aynan shu yerda solishtirish o'zini oqlaydi: unit, paketlar bazasi va sudoers bitta yo'lni ko'rsatishi kerak. Shunday bo'lsa, EXEC xatosi qayta yuklamasdan va ikkilik faylning uchinchi joydagi nusxasisiz yo'qoladi.

Qayta yuklashdan oldin tahlil qilingan buyruqni isbotlang

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 hal qiluvchi chiqish, chunki u systemd haqiqatan tahlil qilgan argv ni, har qanday drop-in bilan birga chop etadi. systemd-analyze verify qayta yuklashdan oldin yo'q yoki bajarilmaydigan yo'lni ushlaydi, qayta yuklashdan keyingi status buyrug'i esa jarayon hozir bor-yo'qligini aytadi.

Agar unit boshlanib, keyin muvaffaqiyatsiz bo'lsa, siz EXEC oilasidan chiqib, mijozning o'z xatolik ishloviga kirdingiz. Jurnaldan mijoz xabarini qidiring, yana bir execve nosozligini emas. unit diff va sudoers diff ni o'zgartirish yozuvida birga saqlang, keyingi yangilanish bo'lingan yo'lni jimgina qaytarmasligi uchun.

O'xshash maqolalar