Четрдесет .ovpn датотека за једну земљу долази од провајдера, и план изгледа очигледно: копирајте насумичну на њено место, затим покрените тунел. Написан као цевовод унутар ExecStart, тај план умире при подизању са статусним кодом који ништа не објашњава. Датотека јединице није скрипта, а поправка је или да експлицитно уведете љуску или да потпуно престанете да бирате датотеке.

Симптом: јединица која се покрене и одмах умре

Статус показује да је услуга пала у делићу секунде, а ред у дневнику именује команду коју ниједна љуска никада не би примила. Ништа о тунелу се не појављује, јер тунел никада није почео.

Читање тачне командне линије из дневника најбржи је начин да то потврдите. systemd понавља оно што је извршио, а низ ће приказати знакове цевовода као дословне аргументе, а не као операторе.

Зашто ExecStart не може да покрене цевовод

systemd сам дели командну линију, примењује сопствена правила наводника и замене променљивих, а затим резултат извршава директно. Цевоводи, преусмеравање, глоб-проширење од љуске и замена команди једноставно нису део те граматике. То је дизајнерски избор, а не пропуст: јединица декларативно каже шта да се изврши, а логика љуске припада скрипти коју јединица позива. Обе поправке произилазе из тога и ниједна не захтева да се јединици дају веће привилегије.

То објашњава и обмањујући излазни код. Први аргумент се третира као бинарна датотека, па неисправна линија пада пре него што се изврши било који део ваше логике.

Обавите избор у ExecStartPre

Директна поправка је припремни корак који експлицитно позива љуску и држи избор и покретање у истој јединици, тако да неуспех у једном не може оставити други да ради сам.

[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

Три детаља одлучују да ли ће ово преживети сусрет са стварном машином. Именовање је прва замка: systemd замењује %i још при рашчлањивању јединице, много пре него што се bash покрене, па спецификатор мора стајати изван једноструких наводника. xargs -r спречава да се cp покрене без аргумента када глоб ни са чим не одговара. А неуспешан припремни корак зауставља јединицу, и то је исправан исход: покретање са јучерашњом конфигурацијом је горе од непокретања. Насумичан избор који увек узима исту датотеку обично није лоша срећа. Проверите да ли копирану датотеку преписује ажурирање пакета или да ли глоб одговара само једном застарелом запису.

Или пустите OpenVPN да изабере крајњу тачку

OpenVPN већ може да држи неколико крајњих тачака у једном профилу и насумично бира међу њима, што потпуно уклања љуску, копирање и право писања из путање подизања.

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

Овај облик држи избор сервера унутар датотеке коју је написао провајдер, па ротација која преименује датотеке не квари јединицу. Он такође чини листу кандидата проверљивом, што глоб над директоријумом никада није. Мешање и даље заслужује своје место када се профили разликују у више од крајње тачке: различити сертификати, различите директиве усмеравања, различита политика шифара. У том случају избор је између целих конфигурација и корак са љуском је искрен начин да се то изрази.

Прочитајте поново инстанцу и датотеку коју је користила

Потврдите која јединица заиста ради пре него што отклоните грешке у њеном садржају. Пакована мета-услуга и шаблон су инфраструктура; јединице које одговарају вашим датотекама су инстанце назване по њима.

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

Инстанца за коју се нико не сећа да ју је омогућио обично води до залутале конфигурационе датотеке у директоријуму пакета. Искључите управо ту именовану инстанцу уместо шаблона, иначе ће је следеће ажурирање пакета вратити. После промене покрените јединицу и прочитајте командну линију коју пријављује дневник, затим потврдите путању конфигурације коју је заиста отворила. Та једна провера раздваја насумичан избор који ради од услуге која тихо поново користи датотеку од прошлог месеца.

Повезани чланци