पुनः लोड पर डेमॉन को मारने और पुनः आरंभ करने के लिए सिस्टमड को कॉन्फ़िगर कैसे करें?


12

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

प्रयास 1: चूक की कोशिश करो। यह सिस्टमड को बताता है कि डेमॉन कैसे शुरू करें, लेकिन इसे फिर से लोड कैसे करें।

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple

परिणामस्वरूप, startऔर restartकाम करते हैं, लेकिन reloadइस त्रुटि देता है:

# systemctl reload MYSERVICE
Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service.

प्रयास 2: यह बताएं कि प्रक्रिया को कैसे मारना है। यह प्रक्रिया को मारता है लेकिन systemd मेरे लिए इसे पुनः आरंभ नहीं करता है।

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
ExecReload=/bin/kill -HUP $MAINPID

...के बाद...

# systemctl daemon-reload
# systemctl reload MYSERVICE

... प्रक्रिया को मारता है, लेकिन यह स्वचालित रूप से पुनरारंभ नहीं होता है।

प्रयास 3: प्रक्रिया को पुनः आरंभ करने के लिए ExecReload का उपयोग करें। यह कुछ कारणों से विफल होता है:

ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE

... त्रुटि संदेश मुझे मिलता है ...:

# systemctl daemon-reload
# systemctl reload MYSERVICE
Job for MYSERVICE.service failed because the control process exited with error code. See "systemctl status MYSERVICE.service" and "journalctl -xe" for details.

मुझे उम्मीद है कि वहाँ एक ReloadType = kill_and_restart या कुछ और होगा, लेकिन ऐसा कोई भाग्य नहीं होगा।

पुनः लोड होने पर डेमॉन को मारने और पुनः आरंभ करने के लिए सिस्टमैड को कैसे बताया जाए?


क्या यह वास्तव में पुनः लोड करने के लिए शूहॉर्न करने की आवश्यकता है , जहां यह बिल्कुल फिट नहीं है? क्या आप डेमन को समझदारी से व्यवहार नहीं कर सकते हैं?
माइकल हैम्पटन

धन्यवाद @Michael Hampton, लेकिन यह ऐसी स्थिति नहीं है जहां मैं कार्यक्रम को फिर से लिख सकता हूं। मैं आपके उपयोगी सुझाव की सराहना करता हूं। उस ने कहा, मुझे यकीन है कि यह एक सामान्य प्रणाली का उपयोग-मामला है और एक विहित जवाब बहुत से लोगों की मदद कर सकता है।
टॉमऑनटाइम

1
मुझे यकीन है कि कोई उत्तर किसी की मदद कर सकता है, इसलिए मैंने सवाल उठाया। मुझे यकीन नहीं है कि यह एक सामान्य उपयोग का मामला है। पांच साल तक सिस्टमैड का उपयोग करने के बाद, लगभग उसी दिन से जब यह दुनिया में फैलाया गया था, यह पहली बार है जब मैं इस तरह के परिदृश्य को देखने का प्रयास करने वाले किसी व्यक्ति के बारे में सुन सकता हूं। यह संभव है कि गुम विवरण के कारण मैं कुछ गलत समझ रहा हूं।
माइकल हैम्पटन

जवाबों:


16

जवाब है, "आप नहीं"! लेकिन हमारे पास अच्छी खबर है।

systemd का दर्शन यह है कि पुनः लोड वैकल्पिक है और सही लोड कार्यक्षमता नहीं होने पर इसे अपरिभाषित छोड़ देना चाहिए। मैं "पुनः लोड कार्यक्षमता" को पुनः लोड के रूप में परिभाषित करता हूं जो सेवा को नहीं मारता है और पुनः आरंभ नहीं करता है, या सेवा को अपना पीआईडी ​​बदल देता है। दूसरे शब्दों में, systemd केवल यह दर्शाना चाहता है कि क्या सुविधाएँ मौजूद हैं।

इसके बजाय, आपको इसका उपयोग करना चाहिए systemctl reload-or-restartजो मौजूद होने पर पुनः लोड करेगा और यदि ऐसा नहीं है तो पुनः आरंभ करें।

मैन पेज से ...

   reload-or-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. If the units are not running yet, they will be started.

   reload-or-try-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. This does nothing if the units are not running. Note that,
       for compatibility with SysV init scripts, force-reload is
       equivalent to this command.

इसलिए: (1) ExecReload को खाली छोड़ दें, (2) उपयोग करें systemctl reload-or-restart MYSERVICEऔर, (3) आपको सभी सेट होने चाहिए।

यदि आप सेवा को मारने और पुनः आरंभ करने के तरीके को परिभाषित करने के लिए ExecReload का उपयोग करने का प्रयास करते हैं, तो यह एक नया PID होगा और systemd भ्रमित हो जाएगा।


3

systemd का दर्शन वह है reloadजो वैकल्पिक है और systemd के उपयोगकर्ता को पता होना चाहिए, हर सेवा के लिए, चाहे वह कॉल reloadकरके कॉल करे या नकली restart

इसलिए, आपके प्रश्न का उत्तर है, "यह काम नहीं करता है, और इसे नहीं करना चाहिए। कृपया इसे अगली उच्चतर परत पर हल करें।"

दूसरे शब्दों में, सिस्टमड आपको केवल " पुनः लोड " लागू करना चाहता है यदि अंतर्निहित सेवा एक वास्तविक पुनः लोड कार्यक्षमता का समर्थन करती है ... अर्थात एक पुनः लोड जो सेवा को नहीं मारता है और पुनः आरंभ नहीं करता है, या सेवा को अपना पीआईडी ​​बदल देता है। दूसरे शब्दों में, systemd केवल यह दर्शाना चाहता है कि क्या सुविधाएँ मौजूद हैं।

आप खुद से पूछ सकते हैं: लेकिन क्या यह आसान नहीं होगा यदि मैं "नकली" रीलोड को लागू कर सकता हूं ताकि सेवा ExecReloadको मारने और पुनः आरंभ करने की अनुमति मिल सके? तब मैं systemctl reload FOOअपनी सभी सेवाओं के लिए उपयोग कर सकता था और मुझे यह याद नहीं रखना था कि कौन से लोग इसका समर्थन करते हैं और कौन सा नहीं?

हां, यह आसान होगा, लेकिन यह सिस्टमड का तरीका नहीं होगा। सिस्टमड चाहता है कि कॉलर वह चीज हो जो reloadसेवा के लिए मौजूद है। Systemd मौजूद सुविधाओं के लिए एक सामान्य इंटरफ़ेस बनना चाहता है, यह अंतराल में भरने के लिए जिम्मेदार नहीं होना चाहता है।

उदाहरण के लिए, कठपुतली मान लिया गया एक systemd संचालित सेवा नहीं है reloadऔर मौत हो गई है और इस प्रक्रिया को पुन: प्रारंभ करने के लिए चूक । यदि सेवा [] प्रकार ने यह निर्दिष्ट करने का एक तरीका जोड़ा है कि पुनः लोड मौजूद है, और इसका उपयोग अधिसूचना पर किया जाना चाहिए, तो यह सीखना होगा कि किन सेवाओं में मूल लोड नहीं है या नहीं है। बावर्ची और अन्य सभी प्रणालियों को भी यही बात सीखनी होगी क्योंकि सिस्टमड चाहता है कि वह उस स्तर पर हल करे। (MiniRant: प्रोसेस सिस्टम शुरू करने के लिए सभी-जानने वाला, सभी-बढ़ते, सभी-नेमस्पेस-कस्टमाइज़िंग i-do-everything-at-my-layer सिस्टम प्रतीत होता है। इसलिए मैं आपको यह नहीं बता सकता कि यह क्यों नहीं होता है। इस दर्शन को पुन: लोड करने के लिए विस्तारित करें। हो सकता है कि लेखकों में से कोई भी यहां झंकार कर सकता है।)


1
वहाँ है systemctl reload-or-restart, जो सेवा का पुनः लोड करेगा यदि वह इसका समर्थन करता है, और यदि यह नहीं है तो इसे पुनः आरंभ करें। पता नहीं क्यों कठपुतली यह धारणा बनाता है।
माइकल हैम्पटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.