0

给定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);
4

2 回答 2

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
于 2013-03-19T16:18:13.590 回答
0

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

于 2013-03-01T06:09:11.787 回答