Отлов 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.