सिस्टम एक प्रक्रिया के लिए SIGTERM कब भेजता है?


24

मेरे सर्वर प्रोग्राम को एक SIGTERM प्राप्त हुआ और बंद हो गया (निकास कोड 0 के साथ)। मैं इससे हैरान हूं, क्योंकि मुझे पूरा यकीन है कि इसके लिए काफी मेमोरी थी। लिनक्स (बिजीबॉक्स) किन परिस्थितियों में एक प्रक्रिया के लिए एक SIGTERM भेजता है?


मैं किसी भी मामले के बारे में नहीं सोच सकता जब कर्नेल या एक मानक उपकरण SIGTERM को एक यादृच्छिक प्रक्रिया में भेज देगा। कार्यक्रम क्या कर रहा है और इसकी शुरुआत कैसे हुई, इसके बारे में आप हमें क्या बता सकते हैं? आपको कार्यक्रम के निकास की स्थिति के बारे में कैसे पता चला? क्या आप समस्या को पुन: उत्पन्न कर सकते हैं? क्या आपके पास लॉग हैं जो आप जांच सकते हैं?
गिल्स एसओ- बुराई को रोकें '

यह एक सीरियल लाइन को पढ़ना और लिखना है, और यूडीपी और टीसीपी अनुरोधों का जवाब दे रहा है। मैंने निष्पादन को बैश स्क्रिप्ट पर लपेटा है और इसलिए मुझे बाहर निकलने का कोड पता है।
म्लेहल्मर्कन

1
Posix प्रलेखन इंगित करता है कि SIGTERM उपयोगकर्ता स्तर की घटना है। क्या यह संभव है कि कोई और आपके सर्वर प्रोग्राम को मार सके?
शेल्टर

3
तुम हो! रिटर्न कोड 0 का मतलब सामान्य निकास है। यदि कोई SIGTERM था, $?तो 143 (128 + सिग्नल नंबर) पर सेट किया जाएगा।
गिल्स एसओ- बुराई को रोकें '

1
इसके अलावा, ^ C SIGINT है, SIGTERM नहीं है, और जो 130 के कोड के साथ बाहर निकल जाएगा।
flarn2006

जवाबों:


13

मैं इसे एक उत्तर के रूप में पोस्ट करूंगा ताकि किसी प्रकार का संकल्प हो अगर यह मुद्दा निकला।

0 से बाहर निकलने की स्थिति का मतलब एक सफल कार्यक्रम से एक सामान्य निकास है। एक बाहर निकलने का कार्यक्रम 0 और 255 के बीच के किसी भी पूर्णांक को अपनी निकास स्थिति के रूप में चुन सकता है। परंपरागत रूप से, कार्यक्रम छोटे मूल्यों का उपयोग करते हैं। 126 और ऊपर के मानों का उपयोग शेल द्वारा विशेष स्थितियों की रिपोर्ट करने के लिए किया जाता है, इसलिए उनसे बचना सबसे अच्छा है।

C API स्तर पर, प्रोग्राम 16-बिट स्थिति की रिपोर्ट करते हैं , जो प्रोग्राम के बाहर निकलने की स्थिति और सिग्नल को एन्कोड करता है जो इसे मारता है, यदि कोई हो।

शेल में, एक कमांड की निकास स्थिति (सहेजी गई $?) प्रोग्राम की वास्तविक निकास स्थिति और सिग्नल मूल्य का पता लगाती है: यदि किसी प्रोग्राम को सिग्नल द्वारा मार दिया जाता है, तो $?यह 128 से अधिक मूल्य पर सेट होता है (अधिकांश शेल के साथ, यह मान है) 128 प्लस सिग्नल नंबर; एटीटी ksh 256 + सिग्नल नंबर का उपयोग करता है और यश 384 + सिग्नल नंबर का उपयोग करता है, जो अस्पष्टता से बचा जाता है, लेकिन अन्य गोले ने सूट का पालन नहीं किया है)।

विशेष रूप से, यदि $?0 है, तो आपका प्रोग्राम सामान्य रूप से बाहर निकलता है।

ध्यान दें कि इसमें एक प्रक्रिया का मामला शामिल है जो SIGTERM को प्राप्त करता है, लेकिन इसके लिए एक सिग्नल हैंडलर है, और अंततः सामान्य रूप से बाहर निकलता है (शायद SIGTERM सिग्नल के अप्रत्यक्ष परिणाम के रूप में, शायद नहीं)।


आपके शीर्षक में प्रश्न का उत्तर देने के लिए, सिस्टरम को सिस्टम द्वारा कभी भी स्वचालित रूप से नहीं भेजा जाता है। कुछ संकेत ऐसे होते हैं जो किसी टर्मिनल के चले जाने पर स्वचालित रूप से SIGHUP की तरह भेजे जाते हैं, SIGSEGV / SIGBUS / SIGILL जब कोई प्रक्रिया ऐसी चीजें करती है जो उसे नहीं करनी चाहिए, तब SIGPIPE जब यह टूटी हुई पाइप / सॉकेट, इत्यादि को लिखता है और वहाँ हैं कुछ संकेतों को एक टर्मिनल में एक प्रमुख प्रेस के कारण भेजा जाता है, मुख्य रूप से SIGINT for Ctrl+ C, SIGQUIT for Ctrl+ \और SIGTSTP Ctrl+ के लिए Z, लेकिन SIGTERM उनमें से एक नहीं है। यदि कोई प्रक्रिया SIGTERM प्राप्त करती है, तो कुछ अन्य प्रक्रिया ने वह संकेत भेजा है।

¹ मोटे तौर पर बोल


सिग्नल मिलने पर स्थिति से बाहर निकलने की स्थिति का अच्छा विवरण। हालाँकि, यह उत्तर ओपी के प्रश्न को संबोधित नहीं करता है।
कोडवर्ड

1
@codeforester मैंने शरीर के प्रश्न का उत्तर दिया, शीर्षक में प्रश्न नहीं। ठीक है, शरीर में एक प्रश्न - यह देखते हुए कि यह गलतफहमी पर आधारित था, यह थोड़ा गड़बड़ है। बाकी के बारे में कुछ शब्द जोड़ूंगा।
गाइल्स का SO- बुराई पर रोक '23

वह शेल पर निर्भर करता है। Ksh93 में, यह 256 + सिग्नम है, यश में, यह 384 + सिग्नम है
स्टीफन चेजेलस

ध्यान दें कि 256 a la ksh से ऊपर के मूल्य का उपयोग करना बेहतर नहीं है क्योंकि यह इसे पारित होने से रोकता है exityashदृष्टिकोण एक अच्छा समझौता है, लेकिन एक दूसरे के लिए आर सी देखें। प्रक्रिया समाप्त होने पर डिफ़ॉल्ट निकास कोड
स्टीफन चेज़लस

10

SIGTERM वह संकेत है जो आमतौर पर एक प्रक्रिया को प्रशासनिक रूप से समाप्त करने के लिए उपयोग किया जाता है।

यह संकेत नहीं है कि कर्नेल भेजेगा, लेकिन यह संकेत है कि एक प्रक्रिया आम तौर पर एक और प्रक्रिया को समाप्त करने के लिए भेजती है।

यही कारण है कि संकेत द्वारा डिफ़ॉल्ट रूप से भेजी जाने वाली है kill, pkill, killall, fuser -k... आदेशों।

यही संकेत है कि उन्हें रोकने के लिए (जैसे service some-service stop) पर डेमॉन को भेजा जाता है, या initशटडाउन से पहले भेजा जाता है (इसके बाद SIGKILL उन प्रक्रियाओं के लिए जो SIGTERM पर समय पर समाप्त होने में कामयाब नहीं हुए हैं)।

ध्यान दें कि SIGTERM सिग्नल नहीं है जो भेजा जाता है ^C। भेजा गया संकेत ^CSIGINT है।

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