सिस्टमड रिस्टार्ट = हमेशा सम्मानित नहीं किया जाता है


53

नोट: मैंने मीडियम पर एक लेख लिखा है जिसमें बताया गया है कि सेवा कैसे बनाई जाए, और इस विशेष समस्या से कैसे बचा जाए: Systemd के साथ लिनक्स सेवा बनाना

मूल प्रश्न:


मैं हर समय काम कर रहे एक स्क्रिप्ट को रखने के लिए systemd का उपयोग कर रहा हूं:

[Unit]
Description=My worker
After=mysqld.service

[Service]
Type=simple
Restart=always
ExecStart=/path/to/script

[Install]
WantedBy=multi-user.target

हालाँकि रीस्टार्ट ठीक काम करता है यदि स्क्रिप्ट कुछ मिनटों के बाद सामान्य रूप से बाहर निकलता है, तो मैंने देखा है कि अगर यह बार-बार स्टार्टअप पर अमल करने में विफल रहता है, systemdतो बस इसे शुरू करने का प्रयास करना छोड़ देगा:

Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.

इसी तरह, मेरी कार्यकर्ता स्क्रिप्ट की एक निकास स्थिति के साथ कई बार विफल रहता है 255, systemdउसे पुन: प्रारंभ करने की कोशिश कर देता है:

Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.  
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.  
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.

क्या कुछ सेकंड के बाद हमेशा पीछे हटने के लिए मजबूर systemdकरने का एक तरीका है ?

जवाबों:


53

मैं राहुल के जवाब को थोड़ा विस्तार देना चाहूंगा।

SystemD कई बार ( StartLimitBurst) को पुनः आरंभ करने का प्रयास करता है और यदि प्रयास गिनती के भीतर पहुंच जाता है तो प्रयास करना बंद कर देता है StartLimitIntervalSec। दोनों विकल्प [unit]अनुभाग के हैं।

निष्पादन के बीच डिफ़ॉल्ट देरी 100ms ( RestartSec) है जिसके कारण दर सीमा बहुत तेज हो जाती है।

SystemD रेस्टार्ट पॉलिसी परिभाषित इकाइयों के लिए कभी भी अधिक स्वचालित रीस्टार्ट का प्रयास नहीं करेगा :

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

राहुल का जवाब मदद करता है, क्योंकि अधिक देरी StartLimitIntervalSecसमय के भीतर त्रुटि काउंटर तक पहुंचने से रोकती है । सही उत्तर दोनों को RestartSecऔर StartLimitBurstउचित मानों को सेट करना है।


5
अब जब मैं (अंततः) समझ गया कि यह कैसे काम करता है, तो कुछ परीक्षण और त्रुटि के बाद, मैं देख सकता हूं कि आपका उत्तर सबसे सही है। मेरे लिए नीचे की रेखा: सेट StartLimitIntervalSec=0और वॉयला।
बेंजामिन

34

हाँ , वहाँ है। आप अनुभाग के xतहत सेकंड के बाद पुन: प्रयास करने के लिए निर्दिष्ट कर सकते हैं [Service],

[Service]
Type=simple
Restart=always
RestartSec=3
ExecStart=/path/to/script

फ़ाइल को सहेजने के बाद आपको systemdनई फ़ाइल के बारे में सुनिश्चित करने के लिए डेमॉन कॉन्फ़िगरेशन को फिर से लोड करना होगा ,

systemctl daemon-reload

फिर परिवर्तनों को सक्षम करने के लिए सेवा को फिर से शुरू करें,

systemctl restart test

जैसा कि आपने अनुरोध किया है, दस्तावेज़ीकरण को देखते हुए,

Restart=on-failure

एक सभ्य सिफारिश की तरह लगता है।


यह वास्तव में काम करने लगता है, धन्यवाद! तो इसे बेहतर तरीके से समझने के लिए, बिना किसी RestartSecनिर्देश के, systemdगंभीर रूप से पुनः आरंभ करने का प्रयास करता है, फिर एक स्थायी विफलता अवस्था में प्रवेश करता है; निर्दिष्ट होने पर कुछ नहीं हो सकता RestartSecहै?
बेंजामिन

इसके अलावा, मैंने देखा है कि यह मेरे कार्यकर्ता के "सामान्य" पुनरारंभ को विलंबित करता है (मैं कुछ मिनटों के बाद कार्यकर्ता को विनम्रतापूर्वक बाहर निकाल रहा हूं); वहाँ केवल एक असफल पुनः आरंभ करने में देरी करने का एक तरीका है ?
बेंजामिन

@ बेंजामिन मेरे अपडेट देखें
राहुल

@ बेंजामिन आप अधिक मापदंडों के लिए यहां जांच कर सकते हैं
राहुल

3
डॉक्टर को देखते हुए , alwaysयह एक सुपरसेट है on-failure, इसलिए यह मदद नहीं करेगा!
बेंजामिन

4

systemd इसे पुनः आरंभ करने का प्रयास करता है

नहीं। Systemd थोड़ी देर के लिए इसे पुनः आरंभ करने का प्रयास करता है । यह उस लॉग में स्पष्ट रूप से दिखाया गया है जिसे आप आपूर्ति करते हैं:

जून 14 11:25:51 लोकलहोस्ट सिस्टम [1]: test.service: परिणाम 'स्टार्ट-लिमिट' के साथ असफल

यह दर लात मारने में सीमित है।

StartLimitIntervalSec=सेटिंग का उपयोग करते हुए सेवा इकाई में निर्दिष्ट की गई थोड़ी देर की लंबाई । दर को सीमित करने के लिए उस अंतराल के भीतर शुरू होने वाले अंकों की संख्या StartLimitBurst=सेटिंग के माध्यम से निर्दिष्ट की जाती है। यदि आपके सिस्टम पर कुछ भी नहीं है, तो वेनिला सिस्टमड से अलग है, जिसमें इन दो सेटिंग्स के लिए चूक शामिल है, तो यह 10 सेकंड के भीतर 5 गुना है।

StartLimitIntervalSec=0दर सीमित करना। लेकिन अपनी सेवा को या तो अक्सर बाहर न करें, या बाहर निकलने और पुनरारंभ करने के बीच पर्याप्त निष्क्रिय करें कि यह दर को सीमा तक सीमित नहीं करता है, एक बेहतर दृष्टिकोण है।

ध्यान दें कि दर सीमित करने से यह परवाह नहीं होती है कि आपकी सेवा कैसे समाप्त हो गई है। इसे शुरू करने / पुनः आरंभ करने के प्रयासों की संख्या पर ट्रिगर होता है, चाहे उनका कारण कुछ भी हो।

आगे की पढाई


5
यह स्थायी रूप से हार मानने लगता है, हालांकि: बुध 2016-06-15 01:21:24 CEST के बाद से "सक्रिय: असफल (परिणाम: शुरू-सीमा); 12 घंटे पहले"। यह इस स्थिति में रहता है और स्क्रिप्ट को फिर से निष्पादित नहीं किया जाता है। मैंने मैन्युअल रूप से StartLimitIntervalSec=10और StartLimitIntervalSec=5कोई भाग्य स्थापित करने की कोशिश की ।
बेंजामिन

4
यह डिफ़ॉल्ट रूप से स्थायी रूप से छोड़ देता है। Github.com/systemd/systemd/issues/2416 देखें ।
एडम गोडे

2
नीचे पंक्ति: इसे स्थायी रूप से देने से रोकने के लिए, सेट करें StartLimitIntervalSec=0
बेंजामिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.