鉴于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);
答案 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文档中“错误信号”列表中的剩余信号。