URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7297
[ Назад ]

Исходное сообщение
"обработка сигналов в перл"

Отправлено iliya , 07-Апр-08 15:10 
добрый день.
возникла следующая проблемма:
есть перл скрипт примерно следующего содержания:
#!/usr/bin/perl
use strict;
$SIG{'INT'}  = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'HUP'}  = 'IGNORE';
$SIG{'TSTP'} = 'IGNORE';
$SIG{'QUIT'} = 'IGNORE';
system("./signalsUtil.sh");
вызываемый из перла баш скрипт
$cat signalsUtil.sh
#!/bin/sh
start()
{
   ./to4ki.sh &
   PIDS=$!
}
stop()
{
   if [ ${PIDS} -ne -2 ]; then
      kill -15 ${PIDS}
      PIDS=-2
   fi
}
start
echo "start with $PIDS"
sleep 7
stop

и $cat to4ki.sh
#!/bin/sh
trap  'trap "" 15; echo ""; exit 0' 15

while true
do
  sleep 1
    echo -n "."
done

exit 0

проблемма в следующем, форкнутые от перла процессы наследуют игнорирование сигналов и в скрипте signalsUtil.sh не срабатывает kill -15 и точки рисуются вечно. как можно это починить, кроме как использовать kill -9? например, возможно ли сказать перл скрипту, что он и только он игнорирует сигналы, а форкнутые процессы обрабатывают их в обычном порядке.

заранее спасибо


Содержание

Сообщения в этом обсуждении
"обработка сигналов в перл"
Отправлено NuINu , 08-Апр-08 12:32 
>добрый день.
>возникла следующая проблемма:
>есть перл скрипт примерно следующего содержания:
>заранее спасибо

я вижу два пути:
первое:
в программ стартере написать:
sub ignore {
    print "Get INTTERM, ignore!\n";
}

$SIG{'TERM'} = \&ignore;
тогда в баше будет устанавливаться трап и нормально срабатывать. а о том устанавливается он или нет можно судить по команде
trap -p

второе:
заменить программу точки.sh на программу точки.pl
#!/usr/bin/perl

use strict;
use IO::Handle;

sub stop {
    print "Get INTTERM, quit!\n";
    exit(0);
}

$SIG{'TERM'} = \&stop;

STDOUT->autoflush(1);

while (1) {
    print  ".";
    sleep (1);
}
exit(0);

в отличии от баша перл нормально выставит обработчик сигнала.


"обработка сигналов в перл"
Отправлено iliya , 08-Апр-08 14:31 
>[оверквотинг удален]
>первое:
>в программ стартере написать:
>sub ignore {
>    print "Get INTTERM, ignore!\n";
>}
>
>$SIG{'TERM'} = \&ignore;
>тогда в баше будет устанавливаться трап и нормально срабатывать. а о том
>устанавливается он или нет можно судить по команде
>trap -p

огромное спасибо :) все вылечилось :)
как мнгого я еще не знаю :)