Saya relatif baru di systemd dan sedang mempelajari arsitekturnya.
Saat ini, saya mencoba mencari cara untuk menjalankan skrip shell khusus. Skrip ini harus dijalankan setelah lapisan jaringan telah dimulai.
Saya menjalankan Arch, menggunakan systemd dan juga netctl.
Untuk menguji, saya menulis skrip sederhana yang hanya menjalankan ip addr list > /tmp/ip.txt
. Saya membuat file layanan berikut untuk skrip ini.
(/etc/systemd/system/test.service)
[Unit]
Description=test service
[Service]
ExecStart=/root/test.script
[Install]
WantedBy=multi-user.target
Saya kemudian mengaktifkan skrip dengan,
systemctl enable test
Saat memulai ulang, skrip memang berjalan, tetapi berjalan sebelum jaringan dimulai. Dengan kata lain, output dalam ip.txt
tidak menampilkan alamat IPv4 yang ditetapkan ke antarmuka utama. Pada saat saya login, alamat IPv4 memang telah ditetapkan dan jaringan sudah aktif.
Saya kira saya bisa mengubah titik di mana skrip berjalan dengan mengacaukan WantedBy
parameter, tapi saya tidak yakin bagaimana melakukannya.
Bisakah seseorang mengarahkan saya ke arah yang benar?
Jawaban yang Diterima:
Pada dependensi konfigurasi jaringan systemd
Sangat mudah untuk mempengaruhi pemesanan unit systemd. Di sisi lain, Anda harus berhati-hati tentang apa yang dijamin oleh unit yang telah selesai.
Konfigurasikan layanan Anda
Pada sistem saat ini,
memesan setelah network.target
hanya menjamin bahwa layanan jaringan telah dimulai, bukan karena ada beberapa konfigurasi yang sebenarnya. Anda perlu memesan setelah network-online.target
dan tarik untuk mencapainya.
[Unit]
Wants=network-online.target
After=network-online.target
Untuk kompatibilitas dengan sistem yang lebih lama, Anda mungkin perlu memesan setelah network.target juga.
[Unit]
Wants=network-online.target
After=network.target network-online.target
Itu untuk file unit layanan Anda dan untuk systemd.
Implementasi dalam versi perangkat lunak saat ini
Sekarang Anda perlu memastikan bahwa network-online.target
berfungsi seperti yang diharapkan (atau setidaknya Anda dapat menggunakan network.target
).
Versi NetworkManager saat ini menawarkan NetworkManager-wait-online.service
yang ditarik oleh network-online.target
dan dengan demikian oleh layanan Anda. Layanan khusus ini memastikan bahwa layanan Anda akan menunggu hingga semua koneksi yang dikonfigurasi untuk dimulai secara otomatis berhasil, gagal, atau habis waktu.
Versi systemd-networkd current saat ini memblokir layanan Anda hingga semua perangkat dikonfigurasi seperti yang diminta. Lebih mudah karena saat ini hanya mendukung konfigurasi yang diterapkan pada saat boot (lebih khusus waktu startup `systemd-networkd.service).
Demi kelengkapan, /etc/init.d/network
service di Fedora, sebagaimana ditafsirkan oleh versi systemd saat ini, memblokir network.target
dan dengan demikian secara tidak langsung memblokir network-online.target
dan layanan Anda. Ini adalah contoh implementasi berbasis skrip.
Jika implementasi Anda, apakah berbasis daemon atau berbasis skrip, berperilaku sebagai salah satu layanan manajemen jaringan di atas, itu akan menunda dimulainya layanan Anda hingga konfigurasi jaringan berhasil diselesaikan, gagal karena alasan yang baik, atau habis waktu setelah waktu yang wajar. bingkai untuk diselesaikan.
Terkait:Cari file yang nama pathnya berisi beberapa kata tanpa urutan tertentu di antara mereka?Anda mungkin ingin memeriksa apakah netctl bekerja dengan cara yang sama dan informasi tersebut akan menjadi tambahan yang berharga untuk jawaban ini.
Implementasi dalam versi perangkat lunak yang lebih lama
Saya tidak berpikir Anda akan melihat versi systemd yang cukup lama di mana ini tidak akan berfungsi dengan baik. Tetapi Anda dapat memeriksa bahwa setidaknya network-online.target
ada dan akan dipesan setelah network.target
.
Sebelumnya NetworkManager hanya menjamin bahwa setidaknya satu koneksi akan diterapkan. Dan bahkan agar itu berfungsi, Anda harus mengaktifkan NetworkManager-wait-online.service
secara eksplisit. Ini telah lama diperbaiki di Fedora tetapi baru diterapkan baru-baru ini di hulu.
systemctl enable NetworkManager-wait-online.service
Catatan tentang implementasi network.target dan network-online.target
Anda tidak perlu lagi membuat perangkat lunak Anda bergantung pada NetworkManager.service
atau NetworkManager-wait-online.service
maupun layanan khusus lainnya. Sebagai gantinya, semua layanan manajemen jaringan harus memesan sendiri sebelum network.target
dan opsional network-online.target
.
Layanan manajemen jaringan berbasis skrip sederhana harus menyelesaikan konfigurasi jaringan sebelum keluar dan harus memesan sendiri sebelum network.target
dan dengan demikian secara tidak langsung sebelum network-online.target
.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Layanan manajemen jaringan berbasis daemon juga harus memesan sendiri sebelum network.target
meskipun tidak terlalu berguna.
[Unit]
Before=network.target
[Service]
Type=simple
ExecStart=...
Layanan yang menunggu daemon selesai harus memesan sendiri setelah layanan tertentu dan sebelum network-online.target
. Itu harus menggunakan Requisite
pada layanan daemon sehingga langsung gagal jika layanan manajemen jaringan yang bersangkutan tidak digunakan.
[Unit]
Requisite=...
After=...
Before=network-online.target
[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes
Paket harus menginstal symlink ke layanan menunggu di wants
direktori untuk network-online.target
sehingga ditarik oleh layanan yang ingin menunggu jaringan yang dikonfigurasi.
ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/
Dokumentasi terkait
- http://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target
- http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
Catatan akhir
Saya harap saya tidak hanya membantu menjawab pertanyaan Anda pada saat Anda menanyakannya, tetapi juga berkontribusi untuk memperbaiki situasi di hulu dan distribusi Linux, sehingga saya sekarang dapat memberikan jawaban yang lebih baik daripada yang mungkin pada saat menulis yang asli .