我正在运行一个perl脚本,该脚本在内部启动bsub作业。当我基于组id运行perl脚本时,在unix终端中按下控件c时,我想杀死这个perl脚本启动的所有作业。
请告知。
谢谢&当做amrutha
编辑:从注释复制的代码
my $command = "bsub -q normal -g GROUPID <command>";
system($command);
尝试通过kill将SIGTERM
从Ctrl-C 的信号处理程序发送到进程组
$SIG{INT} = sub { kill 15, -$gpid }; # $gpid used in bsub command
这是否有效,以及可靠性如何,取决于这些工作是什么和做什么的许多细节
下面是一个进程如何(在不知情的情况下(躲避子弹的例子,其中子进程更改其进程组ID。它这样做是为了演示向组发出信号,但这也表明了向组发送信号的漏洞。
示例
use warnings;
use strict;
use feature 'say';
my $pid;
$SIG{INT} = sub {
say "Got $_[0]. Send TERM to process group with $pid";
kill 15, -$pid;
};
$pid = fork // die "Can't fork: $!";
if ($pid == 0) {
$SIG{INT} = 'IGNORE';
setpgrp 0, $$;
say "tChild's process group: ", getpgrp;
sleep 10;
say "tkid done";
exit;
};
say "Parent $$ started $pid";
sleep 5;
sleep 3; # return to sleep after signal is handled
say "done";
当kill
被发送到否定PID(或带有负信号(时,它进入该进程组。在这里,我使用子级的$pid
(待分配(,并在子级中将其组id设置为($$
(。
信号也必须在子进程中处理,因为分叉进程继承了处理程序。
几秒钟后按下Ctrl-C,输出为
父10450已启动10451儿童过程组:10451^CGot INT.向组10451发送TERMdone
其中done
在前一次打印后3秒打印。kid done
永远不会来。
如果您希望父级也终止,请在信号处理程序中添加exit
或类似的内容。
如前所述,这可能会失败,因为孩子可以简单地改变自己的小组。一种更可靠的方法是对可能被触发的作业进行编目,然后在运行时找到它们的PID,从而终止它们。一个有用的工具是Proc::ProcessTable。在这篇文章和这篇文章中有一些搜寻过程的例子。