จะเขียนไฟล์หน่วยบริการ systemd อย่างไรจึงจะรอจนกว่าอินเทอร์เฟซเฉพาะขึ้นก่อนที่จะเริ่ม?


14

ฉันพยายามเขียนไฟล์หน่วยสำหรับ hostapd บน Debian

hostapd daemon ดูเหมือนว่าต้องการอินเทอร์เฟซสำหรับอินเทอร์เฟซ Wifi ที่เกี่ยวข้องเพื่อให้ทำงานได้ก่อนที่จะรัน

ฉันลอง network-online.target แล้ว แต่ยังรับ SEGV อยู่ ฉันคิดว่าเป็นเพราะ network-online.target ต้องการเห็นอินเตอร์เฟสใด ๆ เท่านั้นและอินเตอร์เฟสอื่น ๆ เกิดขึ้นก่อนที่อินเทอร์เฟซ Wifi จะพร้อมใช้งานเพียงพอสำหรับ hostapd ให้ทำงาน

วิธีที่ดีที่สุดในการรับบริการรอให้อินเทอร์เฟซเฉพาะก่อนที่จะเริ่มขึ้นคืออะไร?

คำตอบ:


15

ตั้งแต่ systemd 219 คุณอาจใช้systemd-networkd-wait-onlineเครื่องมือของ systemd โดยตรงพร้อม--interfaceพารามิเตอร์เพื่อระบุอินเตอร์เฟสที่จะรอ ตัวอย่างเช่น:

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

อย่างไรก็ตามมีข้อแม้ เครื่องมือนี้ต้องsystemd-networkdใช้งานแม้ว่าจะไม่ได้ทำอะไรในการกำหนดค่าของคุณ ในทางกลับกันเริ่มต้นด้วย systemd 219 เดียวกันsystemd-networkdเป็นซ็อกเก็ตที่เปิดใช้งานและออกโดยอัตโนมัติเมื่อไม่ได้ใช้งาน ดังนั้นทุกสิ่งที่คุณต้องการคือการดึงซ็อกเก็ตของมัน

เมื่อรวมเข้าด้วยกันการแก้ไขไฟล์หน่วยจะมีลักษณะเช่นนี้ ( $IFACEแทนที่ด้วยอินเทอร์เฟซที่คุณต้องการ):

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

[Service]
ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE
ExecStart=/usr/bin/hostapd ...
...

1
ใช่นี่คือสิ่งที่ฉันต้องการ น่าเสียดายที่ฉันติดอยู่กับ Debian 4.6.3 ด้วย systemd 44 ดังนั้นจึงไม่สามารถใช้งานได้ มีความคิดเห็นเกี่ยวกับวิธีทำให้แพลตฟอร์มนี้ทำงานอย่างไร ขอบคุณ!
bigjosh

2
@bigjosh คุณสามารถทำสิ่งที่ชอบperl -e 'sleep 1 until -e "/sys/class/net/myinterface"'ใน ExecStartPre ของคุณได้เสมอ
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.