Есть половина ответа: надо проверять чего возвращает waitpid, иногда он ловит не тот пид, или просто вываливается по сигналу.
Был такой опыт...

А как вываливается из while(), по коду не видно...


31.03.2013 2:43, Ivan Petrov пишет:
есть приложение которое работает примерно в таком цикле

while(1) {
     pipe my $r, my $w;

     if (my $pid = fork) {
        close $w;

        while(<$r>) {
             ...
         }
         close $r;
         waitpid($pid, 0);
         next;
     }

     close $r;
     open STDOUT, '>&', $w;
     open STDERR, '>&', $w;
     close $w;
     # тут exec на дочернее приложение
}

каждый раз когда дочка перезапускается видим сообщение в логе.

периодически нахожу это приложение в следующем состоянии:
запущено 2 или даже 3 дочерних приложения.

то есть получается из while(<>) оно вышло и waitpid отработало, но
дочка осталась жива и продолжает себе работать.
я тут поштудировал perldoc на waitpid и на readline но не могу понять
в чем проблема может быть?

PS: задача приложения - держать счетчики по выводимому логу и
рестартить дочку если та по какой-то причине мрет.



--
С уважением Анатолий.
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить