Saya telah menulis beberapa file layanan pengguna systemd yang saya ingin pengguna aktifkan dan yang membutuhkan koneksi jaringan yang berfungsi. Saya pikir itu akan semudah:
Wants=network-online.target
After=network-online.target
Namun, layanan tampaknya mulai terlalu dini, dan dalam journalctl
saya melihat:
network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.
Kemudian saya mencari lebih banyak dan mencoba
Wants=network.target
After=network.target
dan lakukan sudo systemctl enable systemd-networkd-wait-online.service
.
Sekarang saya miliki di journalctl
:
network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.
Dan sekali lagi layanan dimulai terlalu dini.
Apakah pesan itu seharusnya ada di sana? Bagaimana saya bisa men-debug masalah saya?
EDIT : alasannya sederhana dan secara khusus dinyatakan dalam Arch Wiki :
systemd --user
berjalan sebagai proses terpisah darisystemd --system
proses. Unit pengguna tidak dapat merujuk atau bergantung pada unit sistem.
Posting forum ini sepertinya menyarankan solusi sederhana: Saya harus link
menggunakan unit sistem yang diperlukan sebagai pengguna, sehingga membuat symlink tersedia di jalur pencarian unit.
Setelah melakukan itu, saya tidak melihat No such file or directory
pesan apa pun , namun, saya masih tidak dapat membuat layanan benar-benar berjalan setelah jaringan online. Saya telah mencoba menghubungkan network.target
, network-online.target
dan systemd-networkd-wait-online.service
, mengatur unit saya untuk bergantung pada masing-masing, tanpa hasil. Ketika saya memeriksa status unit yang ditautkan dalam mode pengguna, mereka semua ada yang mati, misalnya:
$ systemctl --user status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.
Namun, saya dapat melihat network-online.target
aktif dalam mode pengguna setelah menautkannya:
$ systemctl --user status network-online.target
● network-online.target - Network is Online
Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.
sumber
Jawaban:
Karena Anda tidak dapat bergantung pada layanan sistem, satu-satunya solusi Anda adalah menyediakan layanan pengguna yang mendeteksi apakah jaringan sedang online. (Atau buat layanan sistem layanan Anda.) Detail untuk layanan pengguna "deteksi-online" akan bergantung pada definisi "online" Anda. Misalnya, menunggu ping ke 8.8.8.8 untuk berhasil. Atau agar resolusi nama DNS berhasil. Sebagai contoh, dalam situasi yang sama dengan vpnc, saya menunggu ping ke vpn IP untuk berhasil.
Kemudian Anda dapat membuat layanan pengguna Anda bergantung pada (Setelah =) layanan pengguna deteksi-online Anda.
sumber
Saya akan merekomendasikan untuk menguji sesuatu seperti ini:
Diikuti oleh:
sumber