Жұмыс істеп тұрған пәрмен жолын ExecStart-қа көшіріп, қайта жүктеңіз — бірлік аргументтерді файл атауы деп қабылдап, істен шығады немесе үнсіз аяқталады. systemd-де ештеңе бұзылмаған. ExecStart — аргументтер тізімі, shell емес, сондықтан құбырлар, қайта бағыттау және шарттар терминалдан шыққан сәтте мағынасын жоғалтады. Shell қайда болуы керегін шешіп, содан кейін не орындалуы керегін дәл айтатын бірлік жазыңыз.

Неге ExecStart ішіндегі құбыр ештеңе істемейді

Пәрмен терминалда терілгенде, shell оны әуелі талдайды. Ол құбыр құрады, қайта бағыттау үшін файлдар ашады және кез келген бағдарлама басталмай тұрып айнымалыларды кеңейтеді. systemd мұның ешқайсысын жасамайды: ол ExecStart-ты өз ережелерімен бөледі және алынған бағдарламаны сол аргументтермен орындайды. Сондықтан > әріптік аргумент ретінде келеді, ал | екі процесті қосу орнына бағдарламаға беріледі. Бірлік дұрыс емес әрекет етіп жатқан жоқ; синтаксис басқа нәрсені білдірген.

Бұл ұқыпсыздық емес, әдейі жасалған, өйткені аргументтерді болжанған түрде өңдеу бірліктерді тексеруге жарамды етеді. Бұл shell бар деп есептейтіндерді ғана таңғалдырады.

Не орындалатынын дәл айтатын бірлік жазыңыз

Мақсаты журналда көрінетін шағын бірліктен бастаңыз, сонда талдау мәселелері туннель мәселелерінен бөлек қалады. Бұл тек бинарлық файлдың нұсқасын хабарлайды.

[Unit]
Description=Report the installed OpenVPN version

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

Жол — орын толтырғыш, сондықтан оны шынымен орнатылған бинарлық файлмен ауыстырыңыз. Type=oneshot соңына дейін орындалатын пәрменге сай келеді, ал журнал параметрлері оның шығысын терминалсыз оқи алатын жерге қояды. Орнату бөлімі әдейі жоқ, сондықтан бірлік жүктелуде қосылудың орнына қолмен шақырылады. Іске қоспас бұрын файлды тексеріңіз, өйткені директива атындағы қате жолдағы қатеден өзгеше сәтсіздікке ұшырайды.

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

Shell логикасын скриптте ұстаңыз

Көмекшіге шынымен шартты логика қажет болса, оны скриптке салып, айқын шақырыңыз. Скриптке интерпретатор жолы, орындау рұқсаты және қызмет хабарлай алатын шығу кодтары қажет. /bin/sh -c тырнақшаға алынған пәрменмен іске қосу жұмыс істейді, бірақ тырнақша ережелерін бірліктің ішінде жасырады және шолуды қиындатады. Атаулы скриптті қолмен сынап, кейін бірлікті өзгертпестен ауыстыруға болады. Интерактивті пайдаланушының shell профиліне сенбеңіз, өйткені қызмет өз ортасымен басталады.

Салыстырмалы жолдар маңызды болғанда WorkingDirectory параметрін орнатыңыз және ортаны терминалда экспорттаудың орнына бірліктің қолдайтын директивалары арқылы беріңіз. Құпиялар қорғалған файлдарға немесе тіркелгі деректеріне жатады, журнал жазып алуы мүмкін аргументтер тізіміне емес.

Шын мәнінде бар бірлікті тексеріңіз

drop-in файлдары өңдегеніңізді есте сақтаған файлға тимей-ақ мінез-құлықты өзгертеді. Менеджер нені жүктегенін және соңғы іске қосу нені хабарлағанын оқыңыз.

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

Бірлік шығарылымы drop-in файлдарын жүктелу ретімен қамтиды, күтпеген ExecStart әдетте содан келеді. Кез келген өзгерістен кейін менеджерді қайта жүктеп, жаңа анықтама systemctl cat басып шығаратын нәрсе екенін растаңыз. Журнал нақты пәрмен жолын және шығу мәртебесін көрсетеді, бұл аргумент мәселесін жоқ бинардан немесе рұқсат қатесінен ажыратады. Содан кейін көмекші қолданыстағы VPN өмірлік цикліне жата ма, әлде қолмен жасалатын диагностика болып қалуы керек пе, соны шешіңіз, өйткені екінші фондық туннель процесі бәсекелес иесін жасайды.

Сұраныс бойынша дұрыс шығыс беретін бірлік — жақсы бірінші кезең. Ол әлі туннель емес және өзін туннель ретінде көрсетпеуі керек.

Қатысты мақалалар