पृष्ठभूमि
मुझे systemdएक नई सेवा के लिए एक स्क्रिप्ट बनाने के लिए कहा गया है foo_daemon, जो कभी-कभी एक "खराब स्थिति" में हो जाती है, और SIGTERM(कस्टम सिग्नल हैंडलर के कारण) होने की संभावना नहीं होगी । डेवलपर्स के लिए यह समस्याग्रस्त है, क्योंकि उन्हें सेवा शुरू / बंद करने / फिर से शुरू करने का निर्देश दिया जाता है:
systemctl start foo_daemon.servicesystemctl stop foo_daemon.servicesystemctl 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प्रक्रिया के खिलाफ जारी करने के बिना जारी किए गए पीआईडी की पुनरावृत्ति की परवाह किए बिना पीआईडी।