GNU/Linux >> Belajar Linux >  >> Linux

Penyebab Script Untuk Dieksekusi Setelah Jaringan Dimulai?

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 .


Linux
  1. Linux – Lokasi Skrip Fsck?

  2. Layanan OS Linux 'scsi_reserve'

  3. Jalankan skrip php sebagai proses daemon

  1. Jalankan skrip bash dari URL

  2. Gelandangan mengeksekusi skrip atau perintah setelah setiap tamu memulai ulang (gelandangan naik)

  3. Jalankan skrip bash setelah login

  1. Mengapa Systemd Menghentikan Layanan Segera Setelah Dimulai?

  2. Bagaimana cara menjalankan skrip dengan systemd tepat sebelum dimatikan?

  3. Systemd :Cara mengeksekusi skrip hanya saat shutdown (bukan saat reboot)