2009-04-22 73 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(@_); 
    } 
} 

杀死进程组是关于你唯一的选择。

相关问题