Kopyahin ang gumaganang command line sa ExecStart, i-reload, at nabigo ang unit o tahimik na lumalabas habang itinuturing na filename ang mga argumento. Walang sira sa systemd. Ang ExecStart ay listahan ng argumento, hindi shell, kaya nawawalan ng kahulugan ang pipe, redirection at kondisyon sa sandaling umalis sila sa iyong terminal. Magpasya kung saan dapat naroon ang shell, pagkatapos ay sumulat ng unit na nagsasabi nang eksakto kung ano ang dapat patakbuhin.

Bakit walang ginagawa ang pipeline sa ExecStart

Kapag nag-type ng command sa terminal, sinusuri muna ito ng shell. Bumubuo ito ng pipeline, nagbubukas ng file para sa redirection at nagpapalawak ng variable bago magsimula ang anumang programa. Wala sa mga iyon ang ginagawa ng systemd: hinahati nito ang ExecStart ayon sa sarili nitong mga tuntunin at pinapatakbo ang resultang programa kasama ng mga argumentong iyon. Kaya dumarating ang > bilang literal na argumento, at ang isang | ay ibinibigay sa programa sa halip na ikonekta ang dalawang proseso. Hindi mali ang kilos ng unit; iba ang ibig sabihin ng syntax.

Sinasadya ito at hindi kapabayaan, dahil ang mahuhulaang paghawak sa argumento ang nagpapaging-auditable ng mga unit. Nakakagulat lamang ito sa mga nag-aakalang may shell.

Sumulat ng unit na nagsasabi nang eksakto kung ano ang tumatakbo

Magsimula sa maliit na unit na makikita ang layunin sa journal, upang manatiling hiwalay ang mga problema sa pag-parse sa mga problema ng tunnel. Ito ay nag-uulat lamang ng bersyon ng isang binary.

[Unit]
Description=Report the installed OpenVPN version

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

Ang path ay placeholder, kaya palitan ito ng binary na aktuwal na naka-install. Type=oneshot ay angkop sa command na tumatakbo hanggang matapos, at inilalagay ng mga setting ng journal ang output nito kung saan mababasa mo ito nang walang terminal. Sadyang walang seksyon ng pag-install, kaya ang unit ay tinatawag sa kamay sa halip na i-enable sa boot. I-validate ang file bago ito simulan, dahil ang typo sa pangalan ng direktiba ay nabigo nang iba kaysa sa typo sa path.

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

Panatilihin ang shell logic sa script

Kapag tunay na kailangan ng helper ang kondisyonal na logic, ilagay ang logic na iyon sa script at tawagin ito nang tahasan. Kailangan ng script ng interpreter line, pahintulot sa pagpapatakbo at mga exit code na maiuulat ng serbisyo. /bin/sh -c na may command sa loob ng quotes ay gumagana, ngunit itinatago nito ang mga tuntunin ng quotes sa loob ng unit at pinapahirapan ang pagsusuri. Ang script na may pangalan ay maaaring subukan sa kamay at palitan mamaya nang hindi ineedit ang unit. Huwag umasa sa shell profile ng interactive na user, dahil nagsisimula ang serbisyo sa sarili nitong environment.

Kapag mahalaga ang relative path, WorkingDirectory itakda, at ipasa ang environment sa pamamagitan ng mga sinusuportahang direktiba ng unit sa halip na i-export ito sa terminal. Ang mga sikreto ay nasa protektadong file o kredensyal, hindi sa listahan ng argumento na maaaring itala ng journal.

Suriin ang unit na aktuwal na umiiral

Binabago ng drop-in file ang pag-uugali nang hindi hinahawakan ang file na natatandaan mong inedit mo. Basahin kung ano ang ni-load ng manager at ano ang iniulat ng huling pagtakbo.

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

Kasama sa dump ng unit ang mga drop-in file sa ayos ng pag-load, at doon kadalasang nagmumula ang hindi inaasahang ExecStart. Pagkatapos ng anumang pagbabago, i-reload ang manager at kumpirmahin na ang bagong depinisyon ang siyang ipiniprint ng systemctl cat. Ipinapakita ng journal ang eksaktong command line at exit status, na naghihiwalay sa problema sa argumento mula sa kulang na binary o error sa pahintulot. Pagkatapos ay magpasya kung ang helper ay bahagi ng umiiral na lifecycle ng VPN o dapat manatiling manu-manong diagnostic, dahil ang pangalawang background tunnel process ay lumilikha ng karibal na may-ari.

Ang unit na nagpi-print ng tamang output kapag hiniling ay isang magandang unang milestone. Hindi pa ito tunnel, at hindi ito dapat magpanggap na isa.

Kaugnay na mga artikulo