Systemd Unit सेवा पुनरारंभ होती है यदि कोई अन्य सेवा प्रारंभ या पुनः लोड होती है


16

मैं वहाँ के साथ एक तरीका है जानना चाहते हैं Systemdपुनः आरंभ करने के लिए A.service( After) जब B.serviceशुरू कर दिया या पुनः लोड हो (पुनः लोड config केवल), संपादन के बिना संभव हो तो B.serviceजो स्थापित किया है और सिस्टम के द्वारा उन्नत बनाया है।

A.serviceB.serviceस्थापित, अक्षम या बंद होने पर भी शुरू होना चाहिए ।

A.service:

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service:

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target

जवाबों:


12

आप अनुभाग PartOfमें उपयोग कर सकते हैं [Unit]

उदाहरण: PartOf=B.service

मैन पेज से,

PartOf =

आवश्यकता के समान निर्भरता को कॉन्फ़िगर करता है =, लेकिन इकाइयों को रोकने और पुनः आरंभ करने तक सीमित। जब सिस्टमड यहां सूचीबद्ध इकाइयों को रोकता या फिर से चालू करता है, तो कार्रवाई इस इकाई के लिए प्रचारित की जाती है। ध्यान दें कि यह एक तरफ़ा निर्भरता है - इस इकाई में परिवर्तन सूचीबद्ध इकाइयों को प्रभावित नहीं करते हैं।


धन्यवाद, मैं में देख रहा था Overriding vendor settings, लेकिन यह दिखता है और भी आसान है और वादा किया, केवल excpetion मैं नहीं करना चाहती है A, तो बंद करने के लिए Bबंद, बस A.restartअगर B.startतो, वैसे भी मैं कुछ परीक्षण जल्द ही करूँगा और इसे प्रबंधित करने के लिए किसी तरह अगर देखते हैं, आपको बताएंगे
एलेक्स

@ एलेक्स: यदि आप उपयोग करते हैं PartOfऔर Restart=alwaysएक साथ क्या करते हैं?
तुषी

मैं Restart=दस्तावेज़ीकरण देख रहा हूं , मुझे यकीन नहीं है कि oneshotसेवाओं के साथ व्यवहार क्या है , लेकिन इसकी परवाह किए बिना:, When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restartedअगर मैं सही ढंग से समझता हूं कि बी मैन्युअल रूप से रोक रहा है तो ए
एलेक्स

खैर अब, समाप्ति के लिए खुद को पुरस्कृत किया गया, @ तुशी मैं आपके प्रयास और सुझाव की सराहना करता हूं, लेकिन PartOfसवाल का हल नहीं है, वैसे भी आनंद लें।
एलेक्स

@ एलेक्स: ठीक है, अंक मेरे लिए महत्वपूर्ण नहीं हैं। ऐसे और भी कई तरीके हैं जिनसे मैं अंक अर्जित कर सकता हूं। मैं सिर्फ यह जानना चाहता हूं कि प्रदान किया गया समाधान आपके मुद्दे को हल करता है या नहीं। यदि नहीं, तो हम इस पर आगे काम करेंगे। कैसे के PartOfसाथ उपयोग करने के बारे में Restart=always? क्या आपने कोशिश की?
प्रकार

3

मेरे पास कोई नियंत्रण नहीं था , और stopसाथ नहीं रुकना चाहिए , इसलिए मैंने ओवरराइडिंग विक्रेता सेटिंग्स का उपयोग करके समाप्त कर दिया , काम करने लगता है।PartOf=AB

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmd कार्यान्वयन अतुल्यकालिक है और एक संसाधन का उपयोग करें /script.sh भी एक्सेस करने की आवश्यकता है, मुझे कुछ सेकंड के लिए सोने के लिए (अब के लिए) कुछ भी बेहतर नहीं मिला।

मैंने सीधे systemctl [--no-block] try-restartउपयोग करने से पहले उपयोग करने की कोशिश की /script.shलेकिन काम नहीं किया।


मैं इस परिदृश्य का हल भी तलाश रहा हूं। क्या आप कृपया इस समाधान को थोड़ा और समझा सकते हैं? या आपने जो किया है उसे पढ़ने और समझने के लिए कुछ डॉक्स का लिंक दें।
zappy

हाय @zappy, मैनुअल के लिए देखो man systemd.unit(या अगर यह स्थापित नहीं है तो ऑनलाइन खोज करें) और "ओवरराइडिंग विक्रेता सेटिंग्स" अध्याय की तलाश करें।
एलेक्स

आपके इनपुट के लिए धन्यवाद। मैं समझता हूं कि आप उपरोक्त विधि केवल इसलिए चुनते हैं क्योंकि सेवा B एक विक्रेता विशिष्ट है और आप उस सेवा फ़ाइल को संपादित नहीं करना चाहते हैं। लेकिन मेरे मामले में सेवा ए और बी दोनों ही वेंडर नहीं हैं। मुझे लगता है कि यह व्यवस्था में जटिलता जोड़ सकता है। क्या हमारे पास कोई अन्य विकल्प है?
झप्पी

सवाल कुछ साल पुराना है, क्या आपने दस्तावेज़ की जांच की? शायद इस परिदृश्य को तब से कवर किया गया है। जिस समय मैं जल्दी में था लेकिन समय होने पर मैं सिस्टमड ऑफिशियल मेलिंग लिस्ट देखूंगा और वहां पूछूंगा, आखिरकार एक मुद्दा खुला
एलेक्स 10

1

फिलहाल सिस्टमड इस सिनारियो को कवर नहीं करता है। आप इस कार्यक्षमता को केवल सेवा फ़ाइलों के माध्यम से प्राप्त नहीं कर सकते। एक संभावना समान नाम के साथ एक शेल स्क्रिप्ट के माध्यम से सिस्टेक्ट को हाइजैक करने की है और उस जांच में यह देखने के लिए कि क्या B.service को फिर से शुरू / शुरू या फिर से लोड किया जाना है, A.service के साथ भी उचित कार्रवाई करें, और यदि आवश्यक हो तो अद्यतन करें। r.local साथ ही बूट में उचित स्थिति में लाने के लिए। मुझे docker.service और नेटवर्किंग.service से यह समस्या है, लेकिन मैं हमेशा उन्हें एक साथ पुनः आरंभ करता हूं:

systemctl फिर से शुरू करो docker.service नेटवर्किंग.service

जाहिर है, यह प्रभावी नहीं होगा यदि सिस्टम बी खुद को आंतरिक रूप से B.service (जैसे अन्य सेवा फ़ाइलों के माध्यम से) में हेरफेर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.