क्या मैं रिबूट किए बिना सिस्टमड को पुनरारंभ कर सकता हूं?


39

मैं yum updateआरएचईएल 7.4 के बाद सेवाओं को फिर से शुरू करने की कोशिश कर रहा हूं । मैं systemctl का उपयोग कर हर सेवा को पुनः आरंभ सकता है, लेकिन needs-restartingसे yum utilsमुझसे कहता है कि मैं भी खुद को systemd पुनः आरंभ करना चाहिए:

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

क्या मैं systemdसर्वर को रिबूट किए बिना पुनः आरंभ कर सकता हूं , और कैसे?

मुझे कुछ उल्लेख मिले systemctl daemon-reload, लेकिन यह इसे फिर से शुरू होने वाली सूची से गायब नहीं करता है।

जवाबों:


43

डेमॉन को पुनरारंभ करने के लिए, चलाएं

systemctl daemon-reexec

इस में प्रलेखित है मैनपेज :systemctl

Systemd प्रबंधक को पुन: निष्पादित करें। यह प्रबंधक स्थिति को अनुक्रमित करेगा, प्रक्रिया को पुन: लागू करेगा और राज्य को फिर से पुन: व्यवस्थित करेगा। यह कमांड डिबगिंग और पैकेज अपग्रेड को छोड़कर बहुत कम उपयोग की है। कभी-कभी, यह एक भारी वजन के रूप में सहायक हो सकता है daemon-reload। जबकि डेमॉन को पुन: उपयोग किया जा रहा है, उपयोगकर्ता कॉन्फ़िगरेशन की ओर से सुनने वाले सभी सॉकेट सिस्टम सुलभ रहेंगे।

दुर्भाग्य से needs-restartingयह निर्धारित नहीं किया जा सकता है कि systemdवास्तव में पुनरारंभ हो गया है। systemd execsखुद को पुनरारंभ करने के लिए, जो प्रक्रिया के प्रारंभ समय को रीसेट नहीं करता है; लेकिन needs-restartingप्रक्रिया के प्रारंभ समय के साथ निष्पादन योग्य संशोधन समय की तुलना यह निर्धारित करने के लिए कि क्या प्रक्रिया को फिर से शुरू करने की आवश्यकता है (अन्य बातों के अलावा), और परिणामस्वरूप यह हमेशा मानता है कि इसे systemdफिर से शुरू करने की आवश्यकता है ... यह निर्धारित करने के लिए कि क्या systemdवास्तव में पुनरारंभ करने की आवश्यकता है, आप इसका आउटपुट चेक कर सकते हैं lsof -p1 | grep deleted: systemdएक लाइब्रेरी का उपयोग करता है libsystemd-shared, जिसे उसी पैकेज में शिप किया जाता है और इस प्रकार डेमॉन के साथ अपग्रेड किया जाता है, इसलिए यदि systemdआपको पुनः आरंभ करने की आवश्यकता है तो आप इसे लाइब्रेरी के हटाए गए संस्करण का उपयोग करके देखेंगे। यदि lsofकोई हटाई गई फ़ाइलें नहीं दिखाता है, systemdतो उसे पुनः आरंभ करने की आवश्यकता नहीं है। (करने के लिए धन्यवादसंकेत के लिए जेफ Schaller !


1
@ रामन, पीआईडी ​​1 के रूप में daemon-reexecभी काम करने वाला है systemd
स्टीफन किट

3
जरूरतों को फिर से शुरू करने का क्रैड github.com/rpm-software-management/yum/blob/master/… पर उबलता है, जहां यह PID के "start_time" पर सवाल उठाता है; अगर डेमॉन-रेक्सेक अपडेट नहीं करता है, तो आवश्यकताओं को फिर से शुरू करना "भ्रमित" रहेगा।
जेफ स्कालर

1
यह मत समझिए कि किसी भी कोडपाठ में अच्छी तरह से परीक्षण किया गया है, खासकर गैर-रेडहैट सिस्टम पर। डेमॉन-रेक्सेक चलाना तकनीकी रूप से संभव है, लेकिन यह रिबूट करने के लिए सुरक्षित है।
हराल्ड

2
@ हेराल्ड systemdने डेबियन और डेरिवेटिव्स पर किसी भी समय अपग्रेड का उपयोग किया है , इसलिए यह अच्छी तरह से परीक्षण किया गया है। यह यथोचित सीधा (देखने के लिए do_reexecute) है।
स्टीफन किट

1
@StephenKitt - जब मैं lsof -p1 | grep deletedनिम्न आउटपुट को चलाने का प्रयास करता हूं तो जनरेट किया जाता है lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete। रीडिंग ( unix.stackexchange.com/questions/171519/… ) में, ऐसा प्रतीत होता है कि रूट भी इसे एक्सेस नहीं कर पा रहा है। विकल्प क्या होगा lsof -p1 | grep deleted?
प्रेरित

2

मेरे मामले में, मैंने अभी अपग्रेड किया था systemdऔर कोई भी systemctlआदेश विफल हो रहा था:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

हालाँकि init, मैनपेज के अनुसार , आप SIGTERMपीआईडी ​​1 के रूप में चल रहे डेमन को भेजकर वही काम कर सकते हैं , जो काम किया था:

kill -TERM 1

इसने डेमॉन को फिर से लोड किया, जिसके बाद सभी systemctlकमांड ने फिर से काम करना शुरू कर दिया।

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