>Это понятно - но как я понял - эти скрипты выполняются уже
>ПОСЛЕ того как были разосланы синалы SIGTERN и SIGKILL процессом init.
>И мой анализ PID в этих скриптах уже бессмысленен, т.к. приложение
>уже "умерло" не попрощавшись :)
>
>В этом то ПОСЛЕ как раз и вся "засада". Я думаю тебе поможет правильная демонизация твоего процесса!
Почему у тебя родительский процесс bash?? из за того что ты его из basha запустил? демонизируешь свою прогу и все корректно будет получать сигтерм!
Поясни пожалуйста что значит
"Нужно чтобы программа запускалась на терминале tty1"
что это за программа? она обслуживает работу tty1? На нем больше кроме нее никто не работает? Твоя прога его на запись открывает? или она использует STDOUT полученный от bash, а тот получивший его в наследство от login, в свою очередь получивший от getty?
Если нужно работать с tty1, то (ИМХО) надо убрать с tty1 всех этих демонов(вернее только getty :))! и открывать его через open 'dev/tty1'
если ты правильно выполнишь демонизацию своей проги, то ее родителем станет 1 процесс init, а значит она не умрет из за того что ее родителя скропостижно убили.
Вот проверь этот скрипт:
#!/usr/bin/perl -w
use strict;
use POSIX 'WNOHANG';
my $quit = 0;
print "----------Base Start Programm------------------\n";
open(LOG, ">>", "daemon.log");
#Отвязываемся от вывода в текущи терминал
open(STDIN, '</dev/null') or die "Can't read /dev/null: $!";
open(STDOUT, ">>&LOG") or die "Can't write to LOG file: $!";
open(STDERR, ">>&LOG") or die "Can't error to LOG file: $!";
umask(0); #Сброс маски режима создания файлов
$ENV{PATH} = '/bin:/usr/bin';
#Выходим из текущего потока управления, создавая свой, а в текущем завершаемся.
die "Can't fork" unless defined (my $child = fork());
if($child) {
print "close parent, and stay demon";
exit 0; #Завершение родительского сеанса
}
#становимся лидером сессии
POSIX::setsid();
sub sig_worker {
my $sig = shift;
$quit++;
print "I get signal = $sig\n";
return;
}
#Устанавливаем обработчик сигналов
$SIG{TERM} = $SIG{INT} = \&sig_worker;
while(!$quit){
print "Please: Kill me!!!\n";
sleep 1;
}
#Определим причину по которой завершилась программа
if($quit) {
print "Exit by quit = $quit\n";
}
print "---------------- End Programm---------------------\n";
close(LOG);
exit(0);