सवाल सिग्कील के माध्यम से समाप्त करने के लिए बग्गी सिस्टमड सेवा को कॉन्फ़िगर करें


पृष्ठभूमि

मुझे एक बनाने के लिए कहा गया है systemd एक नई सेवा के लिए लिपि, foo_daemon, जो कभी-कभी "खराब स्थिति" में आता है, और इसके माध्यम से मर नहीं जाएगा SIGTERM (संभवतः कस्टम सिग्नल हैंडलर के कारण)। यह डेवलपर्स के लिए समस्याग्रस्त है, क्योंकि उन्हें सेवा को प्रारंभ / बंद / पुनरारंभ करने का निर्देश दिया जाता है:

  • systemctl start foo_daemon.service
  • systemctl stop foo_daemon.service
  • systemctl restart foo_daemon.service

संकट

कभी-कभी, के कारण foo_daemon एक बुरी स्थिति में आना, हमें जबरन इसे मारना होगा:

  • systemctl kill -s KILL foo_daemon.service

सवाल

मैं अपना सेटअप कैसे कर सकता हूं systemd के लिए लिपि foo_daemon ताकि, जब भी कोई उपयोगकर्ता सेवा को रोकने / पुनरारंभ करने का प्रयास करता है, systemd मर्जी:

  • एक सुंदर बंद करने का प्रयास करें foo_daemon के जरिए SIGTERM
  • शटडाउन / समाप्ति के लिए 2 सेकंड तक दें foo_daemon पूरा करना।
  • एक मजबूर शटडाउन का प्रयास करें foo_daemon के जरिए SIGKILL अगर प्रक्रिया अभी भी जिंदा है (इसलिए हमें पीआईडी ​​का पुनर्नवीनीकरण का खतरा नहीं है और systemd मुद्दे SIGKILL गलत पीआईडी ​​के खिलाफ)। जिस उपकरण का हम परीक्षण कर रहे हैं, वह कई प्रक्रियाओं को तेजी से फैलाता है, तो एक समस्या के कारण पीआईडी ​​रीसाइक्लिंग के बारे में एक दुर्लभ लेकिन बहुत ही वास्तविक चिंता है।
  • यदि, व्यावहारिक रूप से, मैं सिर्फ पीआईडी ​​रीसाइक्लिंग के बारे में पागल हूं, मैं बस जारी करने वाली स्क्रिप्ट के साथ ठीक हूं SIGKILL एक पुनर्नवीनीकरण पीआईडी ​​की हत्या के बारे में चिंतित किए बिना पीआईडी ​​प्रक्रिया के खिलाफ।


16
2017-08-28 18:11


मूल


भले ही आप दो सेकंड में 4 मिलियन पीआईडी ​​रोल करने के लिए तेजी से पर्याप्त प्रक्रियाओं को बढ़ाते हैं, systemd नहीं करता लूप जांच में बैठो "क्या यह पिड अभी भी जीवित है? क्या यह पिड अभी भी जीवित है?" क्योंकि यह नहीं करता है जरुरत सेवा मेरे; यह पहले से ही सूचित है कि क्या इसके तत्काल बाल प्रक्रियाएं अभी भी जिंदा हैं या नहीं (साधारण सिगचल और वेटपिड () के माध्यम से)। इसलिए यदि यह देखता है कि SIGTERM के बाद प्रक्रिया समाप्त हो गई है, तो यह उस बिंदु पर सेवा को 'निष्क्रिय' के रूप में चिह्नित करेगी - यह सिगकिल को जांचने, प्रतीक्षा करने और भेजने से परेशान नहीं होगी। - grawity


जवाब:


systemd पहले से ही बॉक्स के बाहर इसका समर्थन करता है, और यह है डिफ़ॉल्ट रूप से सक्षम

एकमात्र चीज जिसे आप अनुकूलित करना चाहते हैं वह टाइमआउट है, जिसे आप कर सकते हैं TimeoutStopSec=। उदाहरण के लिए:

[Service]
TimeoutStopSec=2

अब, systemd एक SIGTERM भेज देगा, सेवा के बाहर निकलने के लिए दो सेकंड प्रतीक्षा करें, और यदि ऐसा नहीं होता है, तो यह एक सिगकिल भेज देगा।

यदि आपकी सेवा व्यवस्थित नहीं है, तो आपको इसके पीआईडी ​​फ़ाइल के साथ पथ प्रदान करने की आवश्यकता हो सकती है PIDFile=

अंत में, आपने उल्लेख किया है कि आपका डिमन कई प्रक्रियाओं को जन्म देता है। इस मामले में, आप सेट करना चाहते हैं KillMode=control-group और systemd cgroup में सभी प्रक्रियाओं के लिए सिग्नल भेज देगा।


23
2017-08-28 18:20



धन्यवाद। एक आखिरी सवाल: मान लीजिए कि सेवा व्यवस्थित नहीं है। मैं इस सेवा के लिए systemd स्क्रिप्ट में क्या जोड़ सकता हूं ताकि systemd पीआईडी ​​फ़ाइल बनाता / प्रबंधित करे? इसके अतिरिक्त, सेवा टेम्पलेट इकाइयों के माध्यम से बहु-आवृत्ति हो सकती है, इसलिए हम इसे आमतौर पर 'systemctl start foo_dameon@1.service "के माध्यम से लॉन्च करते हैं, तो क्या यह स्क्रिप्ट में पीआईडी ​​फ़ाइल तर्क को प्रभावित करेगा? - DevNull
@DevNull systemd पीआईडी ​​फ़ाइलों को बना या प्रबंधित नहीं करता है। ऐसा करने का कोई कारण नहीं है। यदि आपकी सेवा अपनी पीआईडी ​​फ़ाइल नहीं बनाती है, तो यदि संभव हो तो इसे अग्रभूमि में चलाने के लिए कॉन्फ़िगर करें (डेमोनाइजिंग के बजाय) और सेट करें Type=simplesystemd इकाई में। - Michael Hampton♦
अगर सेवा आश्रित है, Type=forking इसका लाभ है (अगर सेवा ठीक से लिखी गई थी) सिस्टम को सूचित करते समय यह पूरी तरह से 'तैयार' है जो टाइप = सरल नहीं कर सकता है। Deemonizing एक समस्या नहीं है, यहां तक ​​कि एक पीआईडी ​​फ़ाइल के बिना - systemd वैसे भी मुख्य प्रक्रिया को ट्रैक करेगा। - grawity
@ ग्रैविटी सच है ... हालांकि यह मेरा अनुभव रहा है कि सेवाएं वास्तव में सेवा शुरू करने के लिए तैयार होने से पहले डिमननाइजेशन करती हैं। एक प्रणालीगत जागरूक सेवा का उपयोग कर Type=notify systemd के लिए सबसे अच्छा है, और कई आम सेवाएं पहले से ही यह करती हैं। लेकिन शायद यह विरासत सेवा नहीं है। ओपी के मामले में, उसके पास एक ऐसी सेवा है जो कई प्रक्रियाओं को जन्म देती है। Systemd दस्तावेज़ इस मामले के बारे में चेतावनी दीजिए। - Michael Hampton♦