добрый день.
возникла следующая проблемма:
есть перл скрипт примерно следующего содержания:
#!/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' 15while true
do
sleep 1
echo -n "."
doneexit 0
проблемма в следующем, форкнутые от перла процессы наследуют игнорирование сигналов и в скрипте signalsUtil.sh не срабатывает kill -15 и точки рисуются вечно. как можно это починить, кроме как использовать kill -9? например, возможно ли сказать перл скрипту, что он и только он игнорирует сигналы, а форкнутые процессы обрабатывают их в обычном порядке.
заранее спасибо
>добрый день.
>возникла следующая проблемма:
>есть перл скрипт примерно следующего содержания:
>заранее спасибоя вижу два пути:
первое:
в программ стартере написать:
sub ignore {
print "Get INTTERM, ignore!\n";
}$SIG{'TERM'} = \&ignore;
тогда в баше будет устанавливаться трап и нормально срабатывать. а о том устанавливается он или нет можно судить по команде
trap -pвторое:
заменить программу точки.sh на программу точки.pl
#!/usr/bin/perluse 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);в отличии от баша перл нормально выставит обработчик сигнала.
>[оверквотинг удален]
>первое:
>в программ стартере написать:
>sub ignore {
> print "Get INTTERM, ignore!\n";
>}
>
>$SIG{'TERM'} = \&ignore;
>тогда в баше будет устанавливаться трап и нормально срабатывать. а о том
>устанавливается он или нет можно судить по команде
>trap -pогромное спасибо :) все вылечилось :)
как мнгого я еще не знаю :)