[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