2009-04-22 65 views
6

透水回答這個問題都集中在叉:當主腳本死亡時,我怎樣才能殺死Perl的'系統'調用?

對於這個問題,我只是詢問電話到 '系統' 功能。

說我有一個名爲sleep.pl腳本:

use strict; 
use warnings; 
sleep(300); 

我再呼籲kill.pl

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

我跑kill.pl並用ps我的腳本找到kill.pl的進程ID並殺死它(不使用kill -9,只是正常殺死)

sleep.pl仍然是sleepi NG。

我想我的問題的解決方案涉及一個SIG處理程序,但是我需要將什麼放入處理程序來殺死子進程?

+0

這需要額外的標籤。例如[殺]。 – 2009-05-27 15:59:39

回答

3

使用setsid使您的過程成爲新的組長。然後,您可以發送一個kill到組ID,並終止屬於該組的所有進程。您從領導者進程產生的所有進程都將繼承組標識並屬於您新創建的組。所以向這個小組發送殺戮將會殺死他們。唯一棘手的是爲了能夠使用setsid,你必須關閉標準輸入和輸出,因爲這是對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 

它是如何工作的?如果你在後臺運行,shell(在我的情況下是bash)應該將你的進程設置爲組長。然後,如果使用kill %?語法shell以正確的方式殺死組。以這種方式

$ 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

總之,使用負PID。 – 2009-05-27 16:00:38

2

你的問題確實是更一般特定實例「如何保證一個孩子時,父母去世死」的問題。沒有得到解決。 system()沒有什麼特別的地方。它只是派生一個子進程並等待它退出。

系統()大致是這樣的:

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

殺死進程組是關於你唯一的選擇。

相關問題