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 жашоо циклине таандыкпы же кол менен жасалуучу диагностика бойдон калышы керекпи, аны чечиңиз, анткени экинчи фондук туннель процесси атаандаш ээсин жаратат.
Суроо боюнча туура чыгышты басып чыгарган бирдик — жакшы биринчи этап. Ал азырынча туннель эмес жана өзүн туннель катары көрсөтпөшү керек.