लिनक्स में विफलता पर किसी सेवा को स्वचालित रूप से पुनरारंभ कैसे करें


23

विंडोज पर, आप सेट कर सकते हैं कि क्या होना चाहिए / जब कोई सेवा विफल हो जाती है। क्या लिनक्स पर एक ही चीज़ को प्राप्त करने का एक मानक तरीका है (विशेष रूप से CentOS)?

मेरे प्रश्न का एक बड़ा हिस्सा यह है: आप कैसे छोड़ी गई कुर्सियां ​​संभालते हैं - उदाहरण के लिए TIME_WAIT, FIN_WAIT1, आदि राज्यों में।

फिलहाल अगर मैं जिस सेवा को क्रेश कर रहा हूं, उसे सुनने के लिए मुझे सॉकेट के खाली होने या सुनने के पोर्ट को बदलने की प्रतीक्षा करनी होगी।

आपकी सहायता के लिए धन्यवाद।

जवाबों:


26

monitविफल होने पर सेवाओं की निगरानी और पुनः आरंभ करने का एक शानदार तरीका है - और आप संभवतः अन्य आवश्यक सेवाओं (जैसे अपाचे) के लिए इसका उपयोग करेंगे। विशेष रूप से सेवाओं के लिए इसका उपयोग कैसे करें, इसका विस्तार से वर्णन करते हुए nixCraft पर एक अच्छा लेख है , हालांकि monitइसके अलावा और भी कई कार्य हैं।

सॉकेट पहलू के लिए, @galraen ने इस मौके का जवाब दिया।


यह शर्म की बात है मुझे तय करना है कि इसका जवाब क्या है। मुझे दो अलग-अलग प्रश्न करने चाहिए थे। @ अपने जवाब के साथ मेरे समाधान के लिए खोज के मेरे सप्ताह समाप्त हो गए। बहुत बहुत धन्यवाद ! @Redmumba धन्यवाद, मोनीट अच्छा लग रहा है!
प्रीयो

जो भी एक आप सही, निश्चित रूप से चिह्नित करने के लिए तय वोट दें @ gelraen का जवाब। सही पर इसका स्थान है, और बहुत जानकारीपूर्ण है।
एंड्रयू एम।

19

केवल सेवा पुनरारंभ भाग का उत्तर देना। मैं मोनीट के रूप में अच्छी तरह से आया था, लेकिन CentOS 7 पर सिस्टमड आपके लिए सभी का ध्यान रखता है। आपको बस इन दो लाइनों को .service फ़ाइल में जोड़ने की आवश्यकता है (यदि वे पहले से ही वहां नहीं हैं):

Restart=always
RestartSec=3

संदर्भ के लिए https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ देखें ।

यदि आप एक कस्टम सिस्टमड सेवा बनाना चाहते हैं, तो अपनी स्वयं की सेवा फ़ाइल लिखना बहुत सरल है। कस्टम http सर्वर के लिए, नीचे दिया गया उदाहरण देखें।

नई सेवा फ़ाइल के साथ संपादक शुरू करें:

vim /etc/systemd/system/httpd.service

और निम्नलिखित सामग्री जोड़ें, जिसे आप आवश्यकतानुसार संपादित कर सकते हैं:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

मैं चाहता हूं कि यह बूट पर अपने आप शुरू हो जाए:

systemctl enable httpd

परिवर्तनों के बारे में सिस्टम को बताएं और सेवा शुरू करें:

systemctl daemon-reload
systemctl start httpd

और अब आप स्थिति देख सकते हैं:

systemctl status httpd

संदर्भ के लिए, https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/ देखें


हां, बिल्कुल, सबसे लोकप्रिय वितरण systemdपर मानक सेवा प्रबंधक , आपके लिए ऐसा कर सकता है।
रॉल्फ

13

आप setsockopt(2)सॉकेट के साथ सुनने के लिए कॉल कर सकते हैं SO_REUSEADDR, इसलिए आप bind(2)सभी कनेक्शनों को समाप्त करने के लिए इंतजार किए बिना इसे फिर से कर पाएंगे । एक और संभावना: कर्नेल से कनेक्शन छोड़ें। FreeBSD के पास इसके लिए tcpdropकमांड है, लिनक्स के बारे में नहीं जानते।


4

यदि आपका linux distro SysV init के बजाय Upstart का उपयोग करता है, तो respawnकीवर्ड ऐसा करता है।

http://upstart.ubuntu.com/cookbook/#respawn


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