Perl脚本,用于在按下控件c时停止bsub作业



我正在运行一个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。在这篇文章和这篇文章中有一些搜寻过程的例子。

相关内容

  • 没有找到相关文章

最新更新