Salin baris perintah yang berfungsi ke dalam ExecStart, muat semula, dan unit gagal atau keluar secara senyap kerana argumen dianggap sebagai nama fail. Tiada apa yang rosak dalam systemd. ExecStart ialah senarai argumen, bukan shell, jadi paip, ubah hala dan bersyarat hilang makna sebaik sahaja meninggalkan terminal anda. Tentukan di mana shell sepatutnya berada, kemudian tulis unit yang menyatakan dengan tepat apa yang perlu dijalankan.

Mengapa saluran paip dalam ExecStart tidak melakukan apa-apa

Apabila perintah ditaip dalam terminal, shell menghuraikannya dahulu. Ia membina saluran paip, membuka fail untuk ubah hala dan mengembangkan pemboleh ubah sebelum mana-mana program bermula. systemd tidak melakukan semua itu: ia memecahkan ExecStart mengikut peraturannya sendiri dan menjalankan program yang terhasil dengan argumen tersebut. Oleh itu > tiba sebagai argumen literal, dan | diserahkan kepada program dan bukannya menyambung dua proses. Unit tidak berkelakuan salah; sintaks itu bermaksud sesuatu yang lain.

Itu disengajakan dan bukan kecuaian, kerana pengendalian argumen yang boleh dijangka itulah yang menjadikan unit boleh diaudit. Ia hanya mengejutkan mereka yang menganggap ada shell.

Tulis unit yang menyatakan dengan tepat apa yang berjalan

Mulakan dengan unit kecil yang tujuannya kelihatan dalam jurnal, supaya masalah penghuraian kekal berasingan daripada masalah terowong. Yang ini hanya melaporkan versi sesuatu binari.

[Unit]
Description=Report the installed OpenVPN version

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

Laluan itu pemegang tempat, jadi gantikannya dengan binari yang benar-benar dipasang. Type=oneshot sesuai untuk perintah yang berjalan hingga selesai, dan tetapan jurnal meletakkan outputnya di tempat yang boleh anda baca tanpa terminal. Tiada bahagian pemasangan secara sengaja, jadi unit dipanggil dengan tangan dan bukannya didayakan semasa but. Sahkan fail sebelum memulakannya, kerana salah taip dalam nama direktif gagal secara berbeza daripada salah taip dalam laluan.

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

Simpan logik shell dalam skrip

Apabila pembantu benar-benar memerlukan logik bersyarat, letakkan logik itu dalam skrip dan panggilnya secara eksplisit. Skrip memerlukan baris jurubahasa, kebenaran laksana dan kod keluar yang boleh dilaporkan oleh perkhidmatan. Menjalankan /bin/sh -c dengan perintah dalam tanda petik memang berfungsi, tetapi ia menyembunyikan peraturan petikan di dalam unit dan menyukarkan semakan. Skrip bernama boleh diuji dengan tangan dan diganti kemudian tanpa menyunting unit. Jangan bergantung pada profil shell pengguna interaktif, kerana perkhidmatan bermula dengan persekitarannya sendiri.

Tetapkan WorkingDirectory apabila laluan relatif penting, dan salurkan persekitaran melalui direktif unit yang disokong dan bukannya mengeksportnya dalam terminal. Rahsia tergolong dalam fail terlindung atau kelayakan, bukan dalam senarai argumen yang mungkin direkodkan oleh jurnal.

Periksa unit yang benar-benar wujud

Fail drop-in mengubah tingkah laku tanpa menyentuh fail yang anda ingat telah disunting. Baca apa yang dimuatkan oleh pengurus dan apa yang dilaporkan oleh larian terakhir.

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

Dump unit merangkumi fail drop-in mengikut susunan pemuatan, dan dari situlah ExecStart yang tidak dijangka biasanya datang. Selepas setiap perubahan, muat semula pengurus dan sahkan bahawa definisi baharu ialah apa yang dicetak oleh systemctl cat. Jurnal menunjukkan baris perintah yang tepat dan status keluar, yang memisahkan masalah argumen daripada binari yang hilang atau ralat kebenaran. Kemudian tentukan sama ada pembantu itu tergolong dalam kitaran hayat VPN sedia ada atau harus kekal sebagai diagnostik manual, kerana proses terowong latar belakang kedua mencipta pemilik yang bersaing.

Unit yang mencetak output yang betul apabila diminta ialah pencapaian pertama yang baik. Ia belum lagi terowong, dan ia tidak sepatutnya berpura-pura menjadi terowong.

Artikel berkaitan