ExecStart shell емес: VPN көмекші бірлігін түзету
ExecStart бағдарламаны аргументтермен іске қосады, shell құбырын емес. Айқын интерпретатор немесе нақты скрипт қолданыңыз, содан кейін бірлікті тексеріп, журналды оқыңыз.
Жұмыс істеп тұрған пәрмен жолын 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.serviceShell логикасын скриптте ұстаңыз
Көмекшіге шынымен шартты логика қажет болса, оны скриптке салып, айқын шақырыңыз. Скриптке интерпретатор жолы, орындау рұқсаты және қызмет хабарлай алатын шығу кодтары қажет. /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 өмірлік цикліне жата ма, әлде қолмен жасалатын диагностика болып қалуы керек пе, соны шешіңіз, өйткені екінші фондық туннель процесі бәсекелес иесін жасайды.
Сұраныс бойынша дұрыс шығыс беретін бірлік — жақсы бірінші кезең. Ол әлі туннель емес және өзін туннель ретінде көрсетпеуі керек.