Bagaimana cara menulis file unit layanan systemd sehingga menunggu sampai antarmuka tertentu sudah habis sebelum memulai?

14

Saya mencoba menulis file unit untuk hostapd di Debian.

Daemon hostapd tampaknya membutuhkan antarmuka untuk antarmuka Wifi terkait untuk dijalankan sebelum dijalankan atau jika tidak SEGV's.

Saya sudah mencoba network-online.target, tetapi masih mendapatkan SEGV. Saya pikir ini karena network-online.target hanya perlu melihat antarmuka APAPUN, dan antarmuka lainnya muncul sebelum antarmuka Wifi cukup siap untuk hostapd untuk bekerja.

Apa cara terbaik untuk membuat layanan menunggu antarmuka tertentu dibuka sebelum memulai?

bigjosh
sumber

Jawaban:

15

Sejak systemd 219, Anda dapat menggunakan systemd-networkd-wait-onlinealat systemd secara langsung, dengan --interfaceparameter untuk menentukan antarmuka yang harus ditunggu. Sebagai contoh:

ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE

Namun, ada peringatan. Alat ini perlu systemd-networkddijalankan, meskipun tidak ada artinya dalam konfigurasi Anda. Di sisi lain, dimulai dengan systemd yang sama 219, systemd-networkddapat diaktifkan soket dan secara otomatis keluar saat idle. Jadi semua yang Anda butuhkan adalah menarik soketnya.

Menyatukan semuanya, modifikasi pada file unit akan terlihat seperti ini (dengan $IFACEdiganti dengan antarmuka yang Anda inginkan):

[Unit]
Requires=systemd-networkd.socket
After=systemd-networkd.socket
...

[Service]
ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE
ExecStart=/usr/bin/hostapd ...
...
intelfx
sumber
1
Ya, inilah yang saya inginkan. Sayangnya saya macet di Debian 4.6.3 dengan systemd 44, jadi saya tidak bisa menggunakannya. Ada ide tentang cara membuatnya bekerja di platform ini? Terima kasih!
bigjosh
2
@ bigjosh, Anda selalu dapat melakukan sesuatu seperti perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'di ExecStartPre Anda
Stéphane Chazelas