Bir ölkə üçün qırx .ovpn faylı provayderdən gəlir və plan aydın görünür: təsadüfi birini yerinə kopyala, sonra tuneli başlat. ExecStart daxilində boru xətti kimi yazılanda bu plan açılışda heç nə izah etməyən status kodu ilə ölür. Unit faylı skript deyil və düzəliş ya açıq şəkildə əmr qabığı gətirmək, ya da fayl seçməyi tamamilə dayandırmaqdır.

Simptom: başlayan və dərhal ölən unit

Status xidmətin saniyənin bir hissəsində uğursuz olduğunu göstərir və jurnal sətri heç bir əmr qabığının ala bilməyəcəyi əmri adlandırır. Tunel barədə heç nə görünmür, çünki tunel heç başlamayıb.

Jurnaldan dəqiq əmr sətrini oxumaq bunu təsdiqləməyin ən sürətli yoludur. systemd icra etdiyini əks etdirir və sətir boru simvollarını operator kimi deyil, hərfi arqumentlər kimi göstərəcək.

ExecStart niyə boru xəttini işlədə bilmir

systemd əmr sətrini özü parçalayır, öz dırnaq və dəyişən əvəzləməsini tətbiq edir, sonra nəticəni birbaşa icra edir. Borular, yönləndirmə, əmr qabığının glob genişləndirməsi və əmr əvəzləməsi sadəcə olaraq bu qrammatikanın hissəsi deyil. Bu, boşluq deyil, dizayn seçimidir: unit nəyin işlədiləcəyi barədə deklarativdir və əmr qabığı məntiqi unitin çağırdığı skriptə aiddir. Hər iki düzəliş bundan irəli gəlir və heç biri unitə daha çox imtiyaz verməyi tələb etmir.

Bu, yanıltıcı çıxış kodunu da izah edir. Birinci arqument ikili fayl kimi qəbul edilir, ona görə pozulmuş sətir sizin məntiqinizin heç biri işləməmişdən əvvəl uğursuz olur.

Seçimi ExecStartPre-də edin

Birbaşa düzəliş əmr qabığını açıq şəkildə çağıran hazırlıq addımıdır və seçimi başlatma ilə eyni unitdə saxlayır ki, birindəki uğursuzluq digərini tək işlək qoymasın.

[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf

Üç detallar bunun real maşınla təmasa tab gətirib-gətirmədiyini həll edir. Adlandırma ilk tələdir: systemd %i-ü uniti təhlil edərkən, bash işləməmişdən çox əvvəl əvəz edir, ona görə spesifikator tək dırnaqdan kənarda durmalıdır. xargs -r glob heç nəyə uyğun gəlmədikdə cp-in arqumentsiz işləməsinin qarşısını alır. Uğursuz hazırlıq addımı isə uniti dayandırır və bu düzgün nəticədir: dünənki konfiqurasiya ilə başlamaq heç başlamamaqdan pisdir. Həmişə eyni faylı seçən təsadüfi seçim adətən bəxtsizlik deyil. Kopyalanan faylın paket yeniləməsi ilə üzərinə yazılıb-yazılmadığını və ya globun tək köhnə qeydə uyğun gəlib-gəlmədiyini yoxlayın.

Və ya qovşağı OpenVPN seçsin

OpenVPN artıq bir profildə bir neçə qovşaq saxlaya və onlar arasından təsadüfi seçə bilər, bu da əmr qabığını, kopyalamanı və yazma icazəsini açılış yolundan tamamilə çıxarır.

client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>

Bu forma server seçimini provayderin yazdığı faylın içində saxlayır, ona görə faylları adlandıran rotasiya uniti pozmur. O, həmçinin namizəd siyahısını yoxlana bilən edir, hansı ki qovluq üzərində glob heç vaxt etmir. Qarışdırma hələ də yerini qazanır, çünki profillər bir qovşaqdan çox şeylə fərqlənir: fərqli sertifikatlar, fərqli marşrutlaşdırma direktivləri, fərqli şifr siyasəti. Bu halda seçim bütöv konfiqurasiyalar arasındadır və əmr qabığı addımı bunu ifadə etməyin dürüst yoludur.

İstifadə edilən instansı və faylı geri oxuyun

Məzmununda sazlama etməzdən əvvəl hansı unitin həqiqətən işlədiyini təsdiqləyin. Paketdəki meta xidmət və şablon infrastrukturdur; fayllarınıza uyğun unitlər onların adını daşıyan instanslardır.

systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager

Heç kimin aktivləşdirdiyini xatırlamadığı instans adətən paket qovluğundakı tək bir konfiqurasiya faylına gedib çıxır. Şablonu deyil, həmin adlı instansı söndürün, əks halda növbəti paket yüksəltməsi onu geri gətirir. Dəyişiklikdən sonra uniti başladın və jurnalın bildirdiyi əmr sətrini oxuyun, sonra onun həqiqətən açdığı konfiqurasiya yolunu təsdiqləyin. Bu tək yoxlama işləyən təsadüfi seçimi keçən ayın faylını səssizcə təkrar istifadə edən xidmətdən ayırır.

Əlaqəli məqalələr