İşləyən əmr sətrini ExecStart-a köçürün, yenidən yükləyin və unit arqumentləri fayl adı kimi qəbul edərək uğursuz olur və ya səssizcə çıxır. systemd-də heç nə pozulmayıb. ExecStart arqumentlər siyahısıdır, shell deyil, ona görə də borular, yönləndirmə və şərtlər terminalınızdan çıxan kimi mənasını itirir. Shell-in harada olacağına qərar verin, sonra dəqiq nə icra olunacağını bildirən unit yazın.

Niyə ExecStart-dakı boru xətti heç nə etmir

Əmr terminalda yazıldıqda onu əvvəlcə shell təhlil edir. O, boru xətti qurur, faylları yönləndirmə üçün açır və hər hansı proqram başlamazdan əvvəl dəyişənləri genişləndirir. systemd bunların heç birini etmir: ExecStart-ı öz qaydaları ilə bölür və yaranan proqramı həmin arqumentlərlə icra edir. Buna görə > hərfi arqument kimi gəlir və | iki prosesi birləşdirmək əvəzinə proqrama verilir. Unit səhv davranmır; sintaksis başqa bir şey nəzərdə tuturdu.

Bu, səhlənkarlıq deyil, qəsdən belədir, çünki arqumentlərin proqnozlaşdırıla bilən işlənməsi unitləri yoxlanıla bilən edir. Bu yalnız shell-in mövcud olduğunu güman edənləri təəccübləndirir.

Dəqiq nə işlədiyini bildirən unit yazın

Məqsədi jurnalda görünən kiçik bir unitlə başlayın ki, təhlil problemləri tunel problemlərindən ayrı qalsın. Bu unit yalnız binar faylın versiyasını bildirir.

[Unit]
Description=Report the installed OpenVPN version

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

Yol yer tutucudur, ona görə onu həqiqətən quraşdırılmış binar ilə əvəz edin. Type=oneshot sona qədər işləyən əmr üçün uyğundur və jurnal parametrləri çıxışını terminal olmadan oxuya biləcəyiniz yerə qoyur. Qəsdən quraşdırma bölməsi yoxdur, ona görə unit yükləmə zamanı aktivləşdirilmək əvəzinə əl ilə çağırılır. Başlatmazdan əvvəl faylı yoxlayın, çünki direktiv adındakı yazı səhvi yoldakı səhvdən fərqli şəkildə uğursuz olur.

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

Shell məntiqini skriptdə saxlayın

Köməkçi həqiqətən şərti məntiqə ehtiyac duyduqda, bu məntiqi skriptə qoyun və açıq şəkildə çağırın. Skriptə interpretator sətri, icra icazəsi və xidmətin bildirə biləcəyi çıxış kodları lazımdır. /bin/sh -c ilə sitatlanmış əmr işə salmaq işləyir, lakin sitat qaydalarını unitin içində gizlədir və yoxlamanı çətinləşdirir. Adlandırılmış skript əl ilə sınana və sonra uniti redaktə etmədən dəyişdirilə bilər. İnteraktiv istifadəçinin shell profilindən asılı olmayın, çünki xidmət öz mühiti ilə başlayır.

Nisbi yollar vacib olduqda WorkingDirectory təyin edin və mühiti terminalda ixrac etmək əvəzinə unitin dəstəklədiyi direktivlərlə ötürün. Sirlər qorunan fayllara və ya etimadnamələrə aiddir, jurnalın qeyd edə biləcəyi arqument siyahılarına deyil.

Həqiqətən mövcud olan uniti yoxlayın

Drop-in faylları yadda saxladığınız fayla toxunmadan davranışı dəyişir. Menecerin nə yüklədiyini və son işə salmanın nə bildirdiyini oxuyun.

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

Unit çıxarışı drop-in faylları yükləmə sırası ilə əhatə edir və gözlənilməz ExecStart adətən buradan gəlir. Hər dəyişiklikdən sonra meneceri yenidən yükləyin və yeni tərifin systemctl cat çap etdiyi şey olduğunu təsdiqləyin. Jurnal dəqiq əmr sətrini və çıxış statusunu göstərir, bu da arqument problemini çatışmayan binardan və ya icazə xətasından ayırır. Sonra qərar verin: köməkçi mövcud VPN həyat dövrünə aiddir, yoxsa əl ilə diaqnostika olaraq qalmalıdır, çünki ikinci fon tunel prosesi rəqib sahib yaradır.

Tələb üzrə düzgün çıxış verən unit yaxşı ilk mərhələdir. Hələ tunel deyil və özünü tunel kimi təqdim etməməlidir.

Əlaqəli məqalələr