किंडर / जेंटलर / सबटलर किलॉल (जैसे "एंडॉल") के बराबर विकल्प?


17

मैं एक ही नाम के साथ सभी प्रक्रियाओं को अधिक कोमल तरीके से कैसे समाप्त करता हूं killall? मैं प्रक्रियाओं को बाधित नहीं करना चाहता, लेकिन उन्हें ठीक से छोड़ने के लिए समय देना चाहिए।


यह सभी देखें:

मैं उबंटू में प्रक्रियाओं को कैसे मार सकता हूं?

सिस्टम मॉनिटर में, किल प्रक्रिया और अंतिम प्रक्रिया में क्या अंतर है?

हत्या (कभी-कभी?) को दो बार लागू करने की आवश्यकता क्यों होती है?

tl; डॉ


1
और आपका सवाल है?
पायलट 6

@ Pilot6 फिर से संचालित : क्या हत्या के लिए एक "नरम" विकल्प है?
नट्टी के बारे में अखरोट

1
"नरम" क्या है?
पायलट 6

जवाबों:


43

1. `किलॉल` पहले से ही अच्छा (सिग्मेर)

killallडिफ़ॉल्ट रूप से भेजता है SIGTERM। यह पहले से ही अच्छा दृष्टिकोण है जो अनुप्रयोगों को स्वयं के बाद साफ करने का मौका देता है। "पहले से ही मर जाओ, अभी!" दृष्टिकोण एक SIGKILLसंकेत भेजने के लिए है, जिसे निर्दिष्ट करने की आवश्यकता है कि विकल्प के रूप में killall। से GNU सी लाइब्रेरी: समाप्ति सिग्नल :

मैक्रो: int SIGTERM

[...] किसी कार्यक्रम को विनम्रतापूर्वक समाप्त करने का सामान्य तरीका है ।


2. सिस्टम मॉनिटर की "अंतिम प्रक्रिया" समान रूप से अच्छी है (SIGTERM, भी)

आप गनोम सिस्टम मॉनिटर के बारे में एक प्रश्न से लिंक करते हैं। इसका उपयोग SIGTERM"एंड प्रोसेस" एक्शन के लिए भी किया जाता है (और मुझे लगता है कि मैं उस प्रश्न के उत्तर का खंडन कर रहा हूं)। अपने आप को सत्यापित करने के लिए आप इसे स्रोत कोड में पा सकते हैं:

डेटा / मेनू

<item>
  <attribute name="label" translatable="yes">_End</attribute>
  <attribute name="action">win.send-signal-end</attribute>
  <attribute name="accel">&lt;Primary&gt;e</attribute>
  <attribute name="target" type="i">15</attribute>
</item>

15 यहाँ संकेत संख्या है। सिग्नल 15 है SIGTERM। और सिस्टम मॉनिटर ने SIGTERMइससे पहले भी अच्छा इस्तेमाल किया है कि अन्य प्रश्न पूछा गया और जवाब दिया गया।


तकनीकी परिशिष्ट (टिप्पणी के जवाब में)

गितुब के प्रतिनिधित्व के माध्यम से देख git blameरहे हैं, यहां वे परिवर्तन किए गए हैं जिनसे संकेत मिलते हैं कि गनोम सिस्टम मॉनीटर के स्रोत कोड में कैसे वर्तनी है:

383007f2 24 जुला 2013 बदला GAction मानकों के साथ संकेत भेजने के लिए डुप्लिकेट किए गए कोड
0e766b2d GAction 18 जुला 2013 पोर्ट प्रक्रिया पॉपअप मेनू
97674c79 3 अक्टू 2012 प्राप्त ProcData संरचना से छुटकारा
38c5296c स्रोत फ़ाइलों में करीब 3 जुला 2011 मेक खरोज वर्दी।

इनमें से कोई नहीं से बदल SIGQUITकरने के लिए SIGTERM, और है कि पिछले एक से पहले लिंक प्रश्न पूछा गया था।


7
स्रोत कोड का जिक्र करने के लिए +1! (+2 "पारंपरिक ज्ञान" के विरोध के लिए, जैसा कि वह थे;)
नट्टी के बारे में अखरोट

ठीक है, यह बताने से पहले कि आप उत्तर का खंडन कर रहे हैं: क्या आपने जांचा था कि स्रोत कोड के सभी संस्करण उपयोग करते हैं 15? यह किसी बिंदु पर बदल दिया गया हो सकता है इसलिए पुराने संस्करण के संबंध में पुराना उत्तर 100% सही हो सकता है।
बकुरीउ सिप

1
@ बकुरीउ मैं उस तरह से विरोधाभास करता हूं, लेकिन निष्पक्ष रूप से, मैं अगली बार मैं यह जांचने के लिए याद रखने की कोशिश करूंगा।
hvd

@ Git पेड़ के पेड़ में बाकुरी, git grep 'SIGQUIT'कुछ भी प्रकट नहीं करता है। संकेतों से संबंधित कुछ भी नहीं मिला है git grep '>3<'। मैं निष्कर्ष निकालता हूं कि सबसे अधिक संभावना है कि गनोम-सिस्टम-मॉनिटर ने कभी उपयोग नहीं किया है SIGQUIT
रुस्लान

@ रोलन git grepकेवल वर्तमान पेड़ को खोजता है, पूरे इतिहास को नहीं। मैं git blame(वास्तव में Github बराबर) का उपयोग करने के लिए थोड़ा गहरा खुदाई, लेकिन अभी भी कुछ भी नहीं है।
hvd

5

@Hvd का उत्तर मूल रूप से सही है। इसे और भी अधिक वापस करने के लिए, initप्रक्रिया पहले प्रक्रियाओं को भेज देगी SIGTERMजब आपके कंप्यूटर को बंद कर रहे हैं, तो एक देरी के बाद भेज देंगे SIGKILLयदि वे पहले से ही बाहर नहीं निकले हैं। प्रक्रियाओं को संभाल नहीं सकते / अनदेखा कर सकते हैं SIGKILL

हालांकि थोड़ा और विस्तार देने के लिए, वास्तविक उत्तर यह है कि आपके पास यह जानने का कोई तरीका नहीं है कि प्रोग्राम इसे संभालता है। SIGTERMकिसी प्रोग्राम को छोड़ने के लिए विनम्रता से पूछने के लिए उपयोग करने के लिए सबसे सामान्य संकेत है, लेकिन सभी सिग्नल हैंडलिंग प्रोग्राम पर सिग्नल के साथ कुछ करने पर निर्भर करता है।

अन्य उत्तरों के आधार पर इसे अलग तरीके से रखने के लिए, यदि आपके पास @Jos या @AlexGreg द्वारा लिखित एक कार्यक्रम था, तो वे संभवतः संभाल रहे होंगे , SIGQUITलेकिन संभवतः नहीं SIGTERM, और इसलिए भेजने की SIGTERMतुलना में कम "नरम" होगा SIGQUIT

मैंने कुछ कोड लिखे हैं, ताकि आप खुद उसके साथ खेल सकें। नीचे के रूप में सहेजें signal-test.c, फिर संकलन करें

gcc -o signal-test signal-test.c

फिर आप इसे चला सकते हैं ./signal-test, और देख सकते हैं कि जब आप अलग-अलग सिग्नल भेजते हैं तो क्या होता है killall -s <signal>

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int flag = 0;

void handle_signal(int s)
{
    flag = s;
}

int main(int argc, char *argv[])
{
    signal(SIGTERM, handle_signal);
    signal(SIGQUIT, handle_signal);

    while(flag == 0){
        sleep(1);
    }
    printf("flag is %d\n", flag);
    return flag;
}

जैसा कि यह खड़ा है, कोड SIGTERM और SIGQUIT दोनों को इनायत से संभालता है। आप सिग्नल हैंडलर को हटाने के लिए लाइनों signal(SIG...( //लाइन की शुरुआत में उपयोग करके) पर टिप्पणी करने की कोशिश कर सकते हैं , फिर दौड़ सकते हैं और फिर से सिग्नल भेज सकते हैं। आपको इन विभिन्न आउटपुटों को देखने में सक्षम होना चाहिए:

$ ./signal-test
Terminated

$ ./signal-test
Quit (core dumped)

$ ./signal-test
flag is 15

$ ./signal-test
flag is 3

आप संकेतों को संभालते हैं या नहीं, इसके आधार पर।

आप संकेतों को अनदेखा करने का भी प्रयास कर सकते हैं:

signal(SIGTERM, SIG_IGN);

यदि आप ऐसा करते हैं तो भेजने SIGTERMसे कुछ नहीं होगा, आपको SIGKILLप्रक्रिया को समाप्त करने के लिए उपयोग करना होगा।

में अधिक जानकारी के लिए man 7 signal। ध्यान दें कि signal()इस तरह से उपयोग करना गैर-पोर्टेबल माना जाता है - हालांकि यह विकल्प की तुलना में बहुत आसान है!

एक अन्य मामूली फुटनोट - सोलारिस पर killallसभी प्रक्रियाओं को मारने का प्रयास करता है। उन सभी को। यदि आप इसे जड़ के रूप में चलाते हैं तो आप आश्चर्यचकित हो सकते हैं :)


1
यह मेरे द्वारा पसंद किए जाने वाले कारणों में से एक है pkill। दूसरा कारण यह है कि इसके साथ जोड़े pgrep, जिससे यह जांचना आसान हो जाता है कि वास्तव में क्या प्रक्रियाएं मारी जाएंगी, और जिनके पास खुद से बेहतर मिलान शब्दार्थ है ps | grep
रैंडम 832

1

"एंड ऑल" होगा killall -s SIGQUIT [process name]। यदि आप एक फैंसी समाधान चाहते हैं, तो परिभाषित करें alias endall='killall -s SIGQUIT'


13
SIGQUITप्रक्रिया बनाने की तरह है abort(3): यह कोर को डंप करता है और फिर प्रक्रिया को मारता है। यह किसी भी तरह से अच्छे / सज्जन / किन्नर के SIGTERMलिए डिफ़ॉल्ट नहीं है killall
रुस्लान

3
संकेतों को संभालने वाली प्रक्रिया के लिए, SIGQUIT(या इससे भी बेहतर SIGINT) की तुलना में अधिक 'नरम' व्यवहार किया जा सकता है SIGTERM, लेकिन यह अनुप्रयोग पर निर्भर है। अनचाहे, उनमें से कोई भी तत्काल समाप्ति का कारण बनता है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

1
यह एक शानदार विचार है, यदि आप अपनी डिस्क पर कोर फ़ाइलों को साफ करना पसंद करते हैं।
नैट एल्ड्रेडगे सेप

2
@Qix: एक चीज़ जो प्रति संकेत बदलती है, वह है कि क्या यह एक डिफ़ॉल्ट फ़ाइल बनाती है या नहीं डिफ़ॉल्ट कार्रवाई पर (जब एप्लिकेशन द्वारा नियंत्रित नहीं किया जाता है)। संभवतः उन संकेतों का उपयोग करना बेहतर होगा जो कोर फ़ाइलों को उत्पन्न नहीं करते हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

1
यह ध्यान देने योग्य है कि ubuntu डिफ़ॉल्ट रूप से कोर फ़ाइल आकार सीमा को 0 पर सेट करता है, इसलिए SIGQUIT वास्तव में एक कोर फ़ाइल (यदि अखंडित) का उत्पादन नहीं करेगा, जब तक कि आप सीमा को संशोधित नहीं करते।
रोजर लाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.