मारने -9 को एक प्रक्रिया में भेजने के लिए प्रक्रिया के सहयोग की आवश्यकता नहीं होती है (जैसे सिग्नल को हैंडल करना), यह बस इसे मार देता है।
आप यह मान रहे हैं कि क्योंकि कुछ संकेतों को पकड़ा जा सकता है और उन्हें नजरअंदाज कर दिया जाता है। लेकिन प्रति के अनुसार man 2 signal
, " संकेत SIGKILL और SIGSTOP को पकड़ा या अनदेखा नहीं किया जा सकता है"। SIGTERM को पकड़ा जा सकता है, यही वजह है कि मैदान kill
हमेशा प्रभावी नहीं होता है - आमतौर पर इसका मतलब है कि प्रक्रिया के हैंडलर में कुछ गड़बड़ हो गई है। 1
यदि कोई प्रक्रिया किसी दिए गए सिग्नल के लिए हैंडलर को परिभाषित (या नहीं) कर सकती है, तो कर्नेल एक डिफ़ॉल्ट कार्रवाई करता है। SIGTERM और SIGKILL के मामले में, इस प्रक्रिया को समाप्त करना है (जब तक कि इसका pid 1 नहीं है, कर्नेल समाप्त नहीं होगा init
) 2 इसका अर्थ है कि इसकी फाइलहैंडल बंद हो गई हैं, इसकी मेमोरी सिस्टम पूल में लौट आई है, इसके माता-पिता SIGCHILD, इसके अनाथ बच्चे हैं init, आदि द्वारा विरासत में मिला है, जैसे कि यह exit
(देखें man 2 exit
) बुलाया था । यह प्रक्रिया अब मौजूद नहीं है - जब तक कि यह एक ज़ोंबी के रूप में समाप्त नहीं होता है, उस स्थिति में यह अभी भी कर्नेल की प्रक्रिया तालिका में कुछ जानकारी के साथ सूचीबद्ध है; ऐसा तब होता है जब इसका जनक नहीं होता हैwait
और इस जानकारी से ठीक से निपटें। हालाँकि, ज़ोंबी प्रक्रियाओं में अब उन्हें कोई मेमोरी आवंटित नहीं की गई है और इसलिए वे निष्पादित नहीं कर सकते हैं।
क्या मेमोरी में एक वैश्विक तालिका जैसा कुछ है जहां लिनक्स एक प्रक्रिया द्वारा उठाए गए सभी संसाधनों का संदर्भ रखता है और जब मैं एक प्रक्रिया को "मारता हूं" तो लिनक्स बस उस तालिका से गुजरता है और संसाधनों को एक-एक करके मुक्त करता है?
मुझे लगता है कि यह काफी सटीक है। भौतिक मेमोरी को पेज द्वारा ट्रैक किया जाता है (एक पेज आमतौर पर 4 केबी चंक के बराबर होता है) और उन पेजों को एक वैश्विक पूल से लिया जाता है और वापस आ जाता है। यह थोड़ा और अधिक जटिल है कि कुछ फ्री होल्ड पेजों में कैश्ड डेटा होता है, जिसमें वे फिर से आवश्यक होते हैं (यानी, डेटा जो अभी भी मौजूदा फ़ाइल से पढ़ा गया था)।
Manpages "संकेतों" के बारे में बात करते हैं लेकिन निश्चित रूप से यह सिर्फ एक अमूर्तता है।
ज़रूर, सभी संकेत एक अमूर्त हैं। वे वैचारिक हैं, जैसे "प्रक्रिया"। मैं शब्दार्थ को थोड़ा खेल रहा हूं, लेकिन अगर आपका मतलब है कि साइगिल गुणात्मक रूप से SIGTERM से अलग है, तो हाँ और नहीं। हां इस अर्थ में कि इसे पकड़ा नहीं जा सकता, लेकिन इस अर्थ में नहीं कि वे दोनों संकेत हैं। सादृश्य से, एक सेब एक नारंगी नहीं है, लेकिन सेब और संतरे एक पूर्वनिर्धारित परिभाषा के अनुसार, दोनों फल हैं। SIGKILL अधिक सार लगता है क्योंकि आप इसे पकड़ नहीं सकते हैं, लेकिन यह अभी भी एक संकेत है। यहाँ SIGTERM हैंडलिंग का एक उदाहरण दिया गया है, मुझे यकीन है कि आपने इन्हें पहले देखा है:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
void sighandler (int signum, siginfo_t *info, void *context) {
fprintf (
stderr,
"Recieved %d from pid %u, uid %u.\n",
info->si_signo,
info->si_pid,
info->si_uid
);
}
int main (void) {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = sighandler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &sa, NULL);
while (1) sleep(10);
return 0;
}
यह प्रक्रिया हमेशा के लिए सो जाएगी। आप इसे एक टर्मिनल में चला सकते हैं और इसे SIGTERM के साथ भेज सकते हैं kill
। यह सामान बाहर थूकता है:
Recieved 15 from pid 25331, uid 1066.
1066 मेरा उदित है। पिड वह शेल होगा जिसमें kill
से निष्पादित किया गया है, या यदि आप इसे फोर्क ( kill 25309 & echo $?
) में मारते हैं तो पीआईडी ।
फिर, SIGKILL के लिए हैंडलर सेट करने का कोई मतलब नहीं है क्योंकि यह काम नहीं करेगा। 3 यदि मैं kill -9 25309
प्रक्रिया समाप्त कर दूंगा। लेकिन यह अभी भी एक संकेत है; कर्नेल को यह जानकारी है कि सिग्नल किसने भेजा , यह किस तरह का सिग्नल है, आदि।
1. यदि आपने संभावित संकेतों की सूची को नहीं देखा है , तो देखें kill -l
।
2. एक और अपवाद, जैसा कि टिम पोस्ट नीचे उल्लेख करता है, निर्बाध नींद में प्रक्रियाओं पर लागू होता है । जब तक अंतर्निहित समस्या हल नहीं हो जाती है, तब तक उन्हें नहीं जगाया जा सकता है, और इसलिए सभी संकेतों (SIGKILL सहित) को अवधि के लिए स्थगित कर दिया गया है। एक प्रक्रिया उद्देश्य पर उस स्थिति को नहीं बना सकती है, हालांकि।
3. इसका मतलब यह नहीं है कि kill -9
अभ्यास करना बेहतर है। मेरा उदाहरण हैंडलर इस अर्थ में एक बुरा है कि यह करने के लिए नेतृत्व नहीं करता है exit()
। SIGTERM हैंडलर का असली उद्देश्य प्रक्रिया को अस्थायी फ़ाइलों को साफ करने जैसी चीजों को करने का मौका देना है, फिर स्वेच्छा से बाहर निकलें। यदि आप उपयोग करते हैं kill -9
, तो यह मौका नहीं मिलता है, इसलिए केवल यही करें कि यदि "स्वेच्छा से बाहर निकलें" भाग विफल हो गया है।
kill -9
संदर्भ ।