Отлов SIGABRT из Perl на VMS

Учитывая 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 ответа

Вы не посылаете сигнал процессу - вы указываете администратору очередей удалить процесс, что он и делает. Я думаю, что самый простой способ сделать то, что вы хотите, это использовать Perl для отправки сигнала. Отправьте свою работу как и прежде и используйте:

$ show system/batch

найти подиум работы. Вы увидите нечто подобное, когда администратор очередей назначит запись 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

Это система VAX или Alpha? Я полагаю, что ваш вызов на удаление не может быть сигналом прерывания вашей текущей работы. Прошло слишком много времени с тех пор, как я его использовал, но я не могу вспомнить инструмент, который посылал бы конкретный сигнал в пакетное задание - LIB$SIGNAL прошел путь от процесса, а не к нему. Вы должны попытаться перехватить оставшиеся сигналы из списка "error-сигналы" в документации sigtrap.

Другие вопросы по тегам