वास्तव में 0 क्या मारता है? [बन्द है]


22

इसमें man pageकहा गया है:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

और मैंने इस तरह की कोशिश की:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

यहाँ के 0रूप में प्रयोग किया जाता है pid। जैसा कि मैंने समझा, kill 0मौजूदा प्रक्रिया में सभी प्रक्रियाओं को मार दूंगा, जिसमें शामिल हैं pid15247। हालाँकि, इसने इस उदाहरण में कुछ नहीं किया। क्या किसी के पास इस बारे में कोई विचार है कि इसका उपयोग कैसे करें?


यह SIGTERMप्रक्रिया को भेजता है , जो उसने किया है। manआदेश इसे अनदेखा करने के लिए चुना गया है।
जोर्डनम

5
@ जोर्डनम, नहीं। एक इंटरैक्टिव शेल द्वारा शुरू की गई नौकरी में शेल की तुलना में एक अलग प्रक्रिया समूह है। यही कारण है कि शेल इसे अग्रभूमि और पृष्ठभूमि में डाल सकता है। देखें ps -jप्रक्रिया समूह देखने के लिए।
स्टीफन चेजलस

1
यह प्रश्न वास्तव में सुपरयूजर प्रश्न की एक प्रति है जो 0 को मारता है वास्तव में क्या करता है? (जो StackOverflow से माइग्रेट किया गया था)। StackOverflow पर और यहां Unix.SE परkill -0 एक अलग विषय है, (डैश पर ध्यान दें) के बारे में भी प्रश्न देखें ।
एडम काटज़

जवाबों:


27

जैसा कि यह कहता है, यह कॉलर के प्रक्रिया समूह के सभी सदस्यों को संकेत भेजता है।

प्रक्रिया समूह का उपयोग शेल में नौकरी नियंत्रण को लागू करने के लिए किया जाता है (उनका उपयोग अन्य चीजों के लिए किया जा सकता है, लेकिन इंटरैक्टिव शेल जॉब नियंत्रण आपके अस्तित्व का मुख्य कारण है)।

आप देखेंगे कि जब आप टाइप करते हैं Ctrl-C, तो वर्तमान नौकरियों की सभी प्रक्रियाएं मार दी जाती हैं, न केवल उन्हें शुरू करने वाली। इसके अलावा, यह पृष्ठभूमि नौकरियों को नहीं मारता है।

यह प्रक्रिया समूहों के साथ हासिल की है। एक नौकरी एक शेल द्वारा शुरू की गई प्रक्रियाओं का एक समूह है जो शेल पृष्ठभूमि या अग्रभूमि में डाल सकता है (टर्मिनल के अग्रभूमि प्रक्रिया समूह या नहीं के रूप में सेट), और एक पूरे के रूप में मार सकता है।

आप प्रक्रिया समूह आईडी और साथ सत्र आईडी के बारे में पता कर सकते हैं ps -j( jके लिए Jओब नियंत्रण)।

PGID के प्रक्रिया समूह को मारने के लिए $x, आप निम्न कार्य करते हैं:

kill -- "-$x"

kill 0 कॉलर के प्रक्रिया समूह को मारता है।

ध्यान दें कि यदि आप ऐसा करते हैं: /bin/kill 0शेल उस killकमांड को निष्पादित करने के लिए एक नया काम शुरू करेगा , इसलिए killकेवल खुद को मार देगा।

killआमतौर पर एक शेल बिल्टिन होता है, इसलिए शेल killके प्रोसेस ग्रुप को मार देगा।

हालाँकि, जब शेल संवादात्मक होता है, तो यह प्रक्रिया प्रबंधन समूह है, इसलिए आमतौर पर शेल के प्रक्रिया समूह में कोई अन्य प्रक्रिया नहीं होती है। शेल द्वारा शुरू की गई सभी प्रक्रियाएं, अन्य प्रक्रिया समूहों में हैं:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

इन सबसे ऊपर, sleepऔर psदो अलग-अलग प्रक्रिया समूहों, पृष्ठभूमि में एक, अग्रभूमि में एक में हैं और वे खोल की प्रक्रिया समूह से अलग हैं।

आप हालांकि कर सकते हैं:

(man kill & sleep 1; ps -j; kill 0)

इंटरैक्टिव शेल उस उपधारा के लिए एक नया प्रक्रिया समूह शुरू करेगा, और दोनों उपधारा और आदमी (और आपके पेजर, ग्रॉफ ... जैसे आदमी द्वारा शुरू किए गए अन्य आदेश) एक ही प्रक्रिया समूह में होंगे, इसलिए kill 0वहां काम करेंगे। ( sleepऊपर पेजर को शुरू करने के लिए पर्याप्त समय देना है ताकि हम इसे ps -jमारने से पहले आउटपुट में देख सकें)।


kill -- -$xवास्तव bash: kill: (-63531) - No such processमें मैक ४.१४ पर बाश ५.०.११ (१) कहता है , लेकिन यह सुनिश्चित है कि प्रक्रिया मौजूद है और चल रही है। pkill -Pठीक काम करता है
kyb

1
@kyb $ x को प्रोसेस ग्रुप आईडी होना चाहिए न कि प्रोसेस आईडी। ps -jपीजीआईडी ​​के बारे में जानने के लिए आउटपुट देखें
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.