2009-04-22 5 views
6

इस सवाल प्रवेशक जवाब कांटे पर ध्यान केंद्रित किया:मैं कैसे मार सकता है पर्ल 'प्रणाली' जब मुख्य स्क्रिप्ट मार दिया जाता है कहता है?

इस प्रश्न के लिए, मैं सिर्फ 'प्रणाली' समारोह के लिए कॉल के बारे में पूछ रहा हूँ ।

use strict; 
use warnings; 
sleep(300); 

मैं तो एक स्क्रिप्ट kill.pl

use strict; 
use warnings; 
system("sleep.pl"); 

मैं kill.pl चलाने के लिए और ps मैं का उपयोग कर कहा जाता है:

मैं एक स्क्रिप्ट sleep.pl कहा जाता है कहो kill.pl की प्रक्रिया आईडी खोजने के लिए और इसे मारने

sleep.pl अभी भी sleepi है (मार -9, बस सामान्य मारने का उपयोग नहीं) एनजी।

मैं कल्पना मेरे सवाल का हल एक SIG हैंडलर शामिल है, लेकिन मैं हैंडलर में डाल करने के लिए बच्चे की प्रक्रिया को मारने के लिए क्या जरूरत है?

+0

यह अतिरिक्त टैग की जरूरत है। उदाहरण के लिए [मार]। –

उत्तर

3

उपयोग setsid अपनी प्रक्रिया नए समूह नेता बनाने के लिए। फिर आप समूह आईडी में एक हत्या भेज सकते हैं और समूह से संबंधित सभी प्रक्रियाओं को मार सकते हैं। लीडर प्रक्रिया से उत्पन्न होने वाली सभी प्रक्रियाएं समूह आईडी का उत्तराधिकारी होती हैं और आपके नव निर्मित समूह से संबंधित होती हैं। तो समूह को मारने से उन्हें मार डालेगा। सेटिड का उपयोग करने में सक्षम होने के लिए केवल एकमात्र मुश्किल चीज है, आपको अपना मानक और आउटपुट बंद करना होगा, क्योंकि यह सेटिड की आवश्यकता है।

3
use strict; 
use warnings; 
setpgrp $$, 0; 
system("sleep.pl"); 
END {kill 15, -$$} 

लेकिन यदि आपको इस दृष्टिकोण की आवश्यकता है तो आप कुछ गलत करते हैं। आपको यह नहीं करना चाहिए। अपनी हत्या प्रक्रिया को सही तरीके से चलाएं और मारें।

$ perl -e 'system("sleep 100")' & 
[1] 11928 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Ss  0:01 /bin/bash 
11928 pts/1 S  0:00 \_ perl -e system("sleep 100") 
11929 pts/1 S  0:00 | \_ sleep 100 
11936 pts/1 R+  0:00 \_ ps f 
$ kill %1 
[1]+ Terminated    perl -e 'system("sleep 100")' 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Rs  0:01 /bin/bash 
11949 pts/1 R+  0:00 \_ ps f 

यह कैसे काम करता है? यदि आप पृष्ठभूमि पर चलते हैं तो शैल (मेरे मामले में बैश) को समूह नेता के रूप में अपनी प्रक्रिया निर्धारित करनी चाहिए। तो अगर आप kill %? वाक्य रचना खोल सही तरीके से समूह को मारता है का उपयोग करें। इस तरह से

$ perl -e 'system("sleep 100")' & 
[1] 12109 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Rs  0:01 /bin/bash 
12109 pts/1 S  0:00 \_ perl -e system("sleep 100") 
12113 pts/1 S  0:00 | \_ sleep 100 
12114 pts/1 R+  0:00 \_ ps f 
$ kill 12109 
[1]+ Terminated    perl -e 'system("sleep 100")' 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Ss  0:01 /bin/bash 
12124 pts/1 R+  0:00 \_ ps f 
12113 pts/1 S  0:00 sleep 100 

लेकिन kill %? काम करता है: इसकी तुलना

$ perl -e 'system("sleep 100")' & 
[1] 12126 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Rs  0:01 /bin/bash 
12126 pts/1 S  0:00 \_ perl -e system("sleep 100") 
12127 pts/1 S  0:00 | \_ sleep 100 
12128 pts/1 R+  0:00 \_ ps f 
$ kill -12126 
[1]+ Terminated    perl -e 'system("sleep 100")' 
$ ps f 
    PID TTY  STAT TIME COMMAND 
4564 pts/1 Ss  0:01 /bin/bash 
12130 pts/1 R+  0:00 \_ ps f 
+0

संक्षेप में, एक नकारात्मक पीआईडी ​​का उपयोग करें। –

2

आपका प्रश्न वास्तव में अधिक सामान्य की एक विशिष्ट उदाहरण "कैसे सुनिश्चित करने के लिए एक बच्चे की मृत्यु हो जाती है जब माता-पिता मर जाता है" सवाल है। बस इसके आसपास नहीं हो रहा है। सिस्टम() के बारे में वास्तव में कुछ खास नहीं है; यह सिर्फ एक बच्चे की प्रक्रिया का त्याग करता है और बाहर निकलने के लिए इंतजार कर रहा है।

sub system 
{ 
    my $kidpid = fork; 
    if ($kidpid) 
    { 
     waitpid $kidpid; 
      # parent process blocks here waiting for the child process to return 
    } 
    else 
    { 
     exec(@_); 
    } 
} 

हत्या प्रक्रिया समूह अपने ही एकमात्र विकल्प के बारे में है:

प्रणाली() मोटे तौर पर यह है।