在VMS上从perl捕获SIGABRT

时间:2013-03-01 01:03:02

标签: perl vms openvms dcl vax

鉴于kill.pl:

$SIG{INT} = sub { print "int\n" };
$SIG{TERM} = sub { print "term\n" };
$SIG{ABRT} = sub { print "abort\n" };

print "sleeping...\n";
sleep 60;

并且kill.com:

$ perl kill.pl

像这样启动+中止:

submit /log_file=kill.log kill.com

delete /entry=XXXXXX/noconfirm

信号处理程序不会被调用。当进程被终止时,类似的代码可以在Linux上运行。

kill.log只显示:

(19:58)$ perl kill.pl
sleeping...
%JBC-F-JOBABORT, job aborted during execution

我阅读了vmsperl文档并尝试了http://perldoc.perl.org/sigtrap.html中的一些内容。有没有办法做到这一点?

请注意,如果我致电:

@kill.com

执行CTRL + C,SIGINT由kill.pl。

处理

我添加了perl标签,以防有人知道是否有办法告诉perl捕获可能是我感兴趣的每个信号。我的尝试是:

$SIG{$_} = \&subroutine for keys(%SIG);

2 个答案:

答案 0 :(得分:1)

您没有向流程发送信号 - 您正在指示队列管理器删除该流程。我认为最简单的方法就是使用Perl发送信号。像以前一样提交你的工作并使用:

$ show system/batch
找到工作的pid。当队列管理器分配了条目572时,您将看到类似的内容:

  Pid    Process Name    State  Pri      I/O       CPU       Page flts  Pages
00003EA1 BATCH_572       HIB      1      259   0 00:00:00.05       511    626  B

将这样的信号发送到pid 0x3ea1,注意作业通知表明它已完成而不是中止:

$ perl -e "kill 'ABRT', 0x3ea1;"
$

Job KILL (queue SYS$BATCH, entry 572) completed

查看你的日志文件,你会在最后看到这两行:

sleeping...
abort

答案 1 :(得分:0)

这是一个VAX还是Alpha系统?我相信你的“删除”电话可能不会给你正在运行的工作丢掉一个中止信号。自从我使用它以来已经太久了,但是不记得会给批处理作业抛出特定信号的工具 - LIB $ SIGNAL来自一个进程,而不是它。您应该尝试捕获sigtrap文档中“错误信号”列表中的剩余信号。