सिस्टमड के तहत एक सेवा को रोकने के लिए एक udev नियम लिखने का सही तरीका क्या है


12

मैं आर्क लिनक्स चला रहा हूं, और मेरे पास एक udv नियम है जो एक डिवाइस को डालने पर एक सेवा शुरू करता है। इस स्थिति में, यह 3 जी मॉडेम प्लग इन होने पर एक कनेक्शन डायल करता है।

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

हालाँकि, यदि उपकरण हटा दिया जाता है, तो systemd सेवा को बंद नहीं करेगा, और इसलिए जब इसे फिर से प्लग किया जाता है, तो यह सेवा शुरू नहीं करेगा, क्योंकि यह पहले से ही चल रहा है।

मुझे जो चाहिए वह है एक मैचिंग udv नियम, जो सेवा को रोकने के लिए डिवाइस को निकालने पर चलता है।

अपडेट करें

नीचे दिए गए उत्तर का उपयोग करते हुए, मेरे पास अब निम्नलिखित udv नियम है

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

केवल आपकी सेवा की आवश्यकता है या, इससे भी बेहतर, यह बताकर कि आपकी डिवाइस के लिए BindsTo निर्दिष्ट करके, आपकी समस्या को पूरी तरह से 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 आपको अभी भी सेवा शुरू करने के लिए udv नियम की आवश्यकता है, मेरा मतलब है कि आपको इसे रोकने के लिए udev का उपयोग करने की आवश्यकता नहीं होगी।
ब्रूनोकोदुत्र

समझ गया। Udv नियम और संशोधित सेवा फ़ाइल दोनों के साथ बहुत अच्छी तरह से काम करता है।
crazystick

2
आप StopWhenUnneeded=trueइसके बजाय BindsToऔर उपयोग कर सकते हैंAfter
सर्ग

@SergA जब तक मैंने यह उत्तर दिया कि काम करने से रोकने वाला एक बग था StopWhenUnneeded=true, लेकिन मेरा मानना ​​है कि यह काफी समय से तय है।
ब्रूनोकोदुत्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.