เป็นวิธีที่ถูกต้องในการเขียนกฎ udev เพื่อหยุดบริการภายใต้ systemd อะไร


12

ฉันกำลังเรียกใช้ Arch Linux และฉันมีกฎ udev ซึ่งเริ่มให้บริการเมื่อมีการเสียบอุปกรณ์ ในกรณีนี้มันจะทำการเชื่อมต่อเมื่อทำการต่อโมเด็ม 3G

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="netcfg@wvdial.service"

อย่างไรก็ตามหากอุปกรณ์ถูกลบออก systemd จะไม่หยุดให้บริการและด้วยเหตุนี้เมื่อเสียบปลั๊กอีกครั้งอุปกรณ์จะไม่เริ่มบริการเนื่องจากมันกำลังทำงานอยู่

สิ่งที่ฉันต้องการคือกฎ udev ที่ตรงกันซึ่งทำงานเมื่ออุปกรณ์ถูกลบเพื่อหยุดบริการ

ปรับปรุง

ใช้คำตอบด้านล่างสิ่งที่ฉันมีตอนนี้คือกฎ udev ต่อไปนี้

KERNEL=="ttyUSB*", SYMLINK=="gsmmodem", TAG+="systemd", ENV{SYSTEMD_WANTS}="vodafone.service"

ด้วยไฟล์เซอร์วิสต่อไปนี้ (ซึ่งถูกคัดลอกและวางโดยทั่วไปจากไฟล์เซอร์วิส netcfg:

[Unit]
Description=Netcfg networking service for Vodafone Dongle
Before=network.target
Wants=network.target
BindsTo=dev-gsmmodem.device
After=dev-gsmmodem.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/netcfg check-iface wvdial
ExecStop=-/usr/bin/netcfg down wvdial
KillMode=none

[Install]
WantedBy=multi-user.target

ฉันใช้netcfg-wvdialจาก AUR เพื่อโทรออก

คำตอบ:


11

ปัญหาของคุณอาจได้รับการแก้ไขโดยใช้ systemd เพียงแค่ระบุว่าบริการของคุณต้องการหรือดีกว่าผูกกับอุปกรณ์ที่กำหนด

พิเศษ:

"หากหนึ่งในหน่วย [ต้องการ / ผูกมัดกับ] หน่วยหนึ่งถูกปิดการใช้งานหรือการเปิดใช้งานล้มเหลวยูนิตนี้ [บริการ] จะถูกปิดการใช้งาน"

คุณเพียงแค่ต้องแก้ไขไฟล์บริการดังต่อไปนี้

[Unit]
<...>
BindsTo=<DEVICE UNIT HERE>.device
<...>
After=<DEVICE UNIT HERE>.device

หมายเหตุ: เพื่อรับรายการไฟล์หน่วยอุปกรณ์ที่มีทั้งหมดใช้ systemctl list-units --all --full | grep ".device"


นี่หมายความว่าฉันไม่ต้องการกฎ udev หรือไม่? ฉันพยายามทำตามที่คุณแนะนำโดยสร้างไฟล์บริการใหม่เพื่อแทนที่ netcfg @ wvdial.service และรวมทั้งสองบรรทัด ดูเหมือนว่าจะหยุดบริการในตอนนี้ แต่จะไม่เริ่มเมื่อเชื่อมต่ออุปกรณ์อีกครั้ง
crazystick

@crazystick คุณยังคงต้องใช้กฎ udev สำหรับการเริ่มบริการสิ่งที่ฉันหมายถึงคือคุณไม่จำเป็นต้องใช้ udev เพื่อหยุดมัน
brunocodutra

เข้าใจแล้ว ทำงานได้ดีมากกับทั้งกฎ udev และไฟล์บริการที่ถูกแก้ไข
crazystick

2
คุณสามารถใช้StopWhenUnneeded=trueแทนBindsToและAfter
SergA

@SergA ตามเวลาที่ฉันตอบมีข้อผิดพลาดในการป้องกันไม่ให้StopWhenUnneeded=trueทำงาน แต่ฉันเชื่อว่ามันได้รับการแก้ไขในขณะนี้
brunocodutra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.