Ishlaydigan buyruq satrini ExecStart ichiga ko‘chiring, qayta yuklang, va unit argumentlarni fayl nomi deb qabul qilib ishlamay qoladi yoki jim chiqadi. systemd da hech narsa buzilmagan. ExecStart — argumentlar ro‘yxati, shell emas, shuning uchun quvurlar, qayta yo‘naltirish va shartlar terminalingizdan chiqqan lahzada ma’nosini yo‘qotadi. Shell qayerda bo‘lishi kerakligini hal qiling, so‘ng nima bajarilishi kerakligini aniq aytadigan unit yozing.

Nega ExecStart ichidagi quvur hech narsa qilmaydi

Buyruq terminalda yozilganda shell avval uni tahlil qiladi. U quvur quradi, qayta yo‘naltirish uchun fayllarni ochadi va biron dastur boshlanishidan oldin o‘zgaruvchilarni kengaytiradi. systemd bularning hech birini qilmaydi: ExecStart ni o‘z qoidalari bilan bo‘ladi va hosil bo‘lgan dasturni o‘sha argumentlar bilan ishga tushiradi. Shuning uchun > so‘zma-so‘z argument sifatida keladi, va | ikki jarayonni ulash o‘rniga dasturga beriladi. Unit noto‘g‘ri ishlamayapti; sintaksis boshqa narsani nazarda tutgan.

Bu beparvolik emas, ataylab shunday, chunki argumentlarni oldindan aytib bo‘ladigan ishlash unitlarni tekshirishga yaroqli qiladi. Bu faqat shell bor deb o‘ylaydiganlarni hayratga soladi.

Nima ishlashini aniq aytadigan unit yozing

Maqsadi jurnalda ko‘rinadigan kichik unitdan boshlang, shunda tahlil muammolari tunnel muammolaridan ajralib turadi. Bu faqat binar fayl versiyasini xabar qiladi.

[Unit]
Description=Report the installed OpenVPN version

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

Yo‘l — o‘rin egallovchi, shuning uchun uni haqiqatan o‘rnatilgan binar fayl bilan almashtiring. Type=oneshot oxirigacha ishlaydigan buyruqqa mos keladi, jurnal sozlamalari esa uning chiqishini terminalisiz o‘qiy oladigan joyga qo‘yadi. Ataylab o‘rnatish bo‘limi yo‘q, shuning uchun unit yuklanishda yoqilish o‘rniga qo‘lda chaqiriladi. Ishga tushirishdan oldin faylni tekshiring, chunki direktiva nomidagi xato yo‘ldagi xatodan boshqacha muvaffaqiyatsizlikka uchraydi.

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

Shell mantiqini skriptda saqlang

Yordamchiga haqiqatan shartli mantiq kerak bo‘lsa, bu mantiqni skriptga qo‘ying va uni aniq chaqiring. Skriptga interpretator qatori, bajarish ruxsati va xizmat xabar qila oladigan chiqish kodlari kerak. /bin/sh -c ni qo‘shtirnoq ichidagi buyruq bilan ishga tushirish ishlaydi, lekin qo‘shtirnoq qoidalarini unit ichida yashiradi va ko‘rib chiqishni qiyinlashtiradi. Nomli skriptni qo‘lda sinab ko‘rish va keyin unitni tahrirlamasdan almashtirish mumkin. Interaktiv foydalanuvchining shell profiliga tayanmang, chunki xizmat o‘z muhiti bilan boshlanadi.

Nisbiy yo‘llar muhim bo‘lganda WorkingDirectory ni o‘rnating va muhitni terminalda eksport qilish o‘rniga unitning qo‘llab-quvvatlanadigan direktivalari orqali uzating. Sirlar himoyalangan fayllarga yoki hisob ma’lumotlariga tegishli, jurnal yozib olishi mumkin bo‘lgan argument ro‘yxatlariga emas.

Haqiqatan mavjud unitni tekshiring

drop-in fayllari siz tahrirlagan deb eslaydigan faylga tegmasdan xatti-harakatni o‘zgartiradi. Menejer nima yuklaganini va oxirgi ishga tushirish nima xabar qilganini o‘qing.

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

Unit chiqarishi drop-in fayllarini yuklanish tartibida o‘z ichiga oladi va kutilmagan ExecStart odatda o‘sha yerdan keladi. Har qanday o‘zgarishdan keyin menejerni qayta yuklang va yangi ta’rif systemctl cat chop etadigan narsa ekanini tasdiqlang. Jurnal aniq buyruq satrini va chiqish holatini ko‘rsatadi, bu argument muammosini yo‘q binar yoki ruxsat xatosidan ajratadi. So‘ng yordamchi mavjud VPN hayot sikliga tegishlimi yoki qo‘lda bajariladigan diagnostika bo‘lib qolishi kerakmi, hal qiling, chunki ikkinchi fon tunnel jarayoni raqib egasini yaratadi.

Talab bo‘yicha to‘g‘ri chiqishni chop etadigan unit yaxshi birinchi bosqich. U hali tunnel emas va o‘zini tunnel deb ko‘rsatmasligi kerak.

O'xshash maqolalar