Saya mengalami masalah yang sama, dengan skrip cadangan userland yang memerlukan akses ke internet. Saya menyelesaikannya dengan menambahkan ~/.config/systemd/user/wait-for-network.service
itu hanya ping google.com
hingga dapat dijangkau:
[Unit]
Description=Ping a server on the internet until it becomes reachable
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'while ! ping -c1 google.com; do sleep 1; done'
TimeoutStartSec=60s
Kemudian saya membuat skrip cadangan saya bergantung padanya seperti ini:
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Ini berfungsi terlepas dari apakah Anda menggunakan NetworkManager
atau cara lain untuk menjalin koneksi.
Lupakan network.target
. man systemd.special
mengatakan:
network.target systemd automatically adds dependencies of type After for this target unit to all SysV init script service units with an LSB header referring to the $network facility.
Jadi, target ini terutama adalah peretasan kompatibilitas untuk skrip init SysV.
Dengan asumsi bahwa koneksi jaringan Anda ditangani oleh NetworkManager, Anda tentu berhak bergantung pada target ini karena NetworkManager.service
mendefinisikan Before=network.target
. Tetapi ini hanya berarti bahwa NetworkManager telah dimulai, bukan berarti koneksi jaringan benar-benar dibuat. Itu mungkin memakan waktu cukup lama (dhcp roundtrip, wifi handshake, dll.) dan sepenuhnya urusan NetworkManager. Setidaknya di sistem saya (F18) ada layanan bernama NetworkManager-wait-online
. Ia menggunakan nm-online
program utilitas untuk memblokir sampai ada sambungan aktif dibuat. Coba Require, Before
itu dalam definisi Unit Anda atau gunakan alat itu sendiri.