[Moscow.pm] readline
Ivan Petrov
i.petro.77.00 на gmail.com
Пн Апр 1 03:12:03 PDT 2013
> Есть половина ответа: надо проверять чего возвращает waitpid, иногда
> он ловит не тот пид, или просто вываливается по сигналу.
> Был такой опыт...
> А как вываливается из while(), по коду не видно...
пока я тоже не понимаю. возможно тут проблема именно в VZ области
лежит. тонкость какая-то. или бага: там центось какая-то древнючая на
хосте стоит ЕМНИП. может современный Perl (libc) на нее недостаточно
адекватно реагирует в каких-то ситуациях.
я пока перед waitpid воткнул kill KILL => $pid; и помогло.
> 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