<html><head><meta http-equiv="Content-Type" content="text/html charset=koi8-r"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Ну с буферизацией там сложности, да. Данные читаются не в момент их поступления в STDOUT дочернего процесса, а, обычно, после окончания его работы и flush буфера. Попробую отлючить буферизацию STDOUT, но не знаю насколько это повлияет на дочерние не перловые процессы.<div>Ну и очень длительные процессы я пока не пробовал гонять - чтобы точно понять когда именно данные долетают до родительского процесса.</div><div><br><div>
<div>С уважением,</div><div>Денис Федосеев</div>
</div>
<br><div><div>On 27 Jun 2013, at 7:27 PM, Андрей Фёдоров <<a href="mailto:secrethost@gmail.com">secrethost@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">> <span style="font-family:arial,sans-serif;font-size:13px">Проблема заключается в том, что при запуске через IPC::Open2 я не могу читать STDOUT этих самых запущенных процессов в процессе их работы. </span><div>
<span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style=""><font face="arial, sans-serif">Похоже на проблему с буферизацией вывода в дочерних процессах. Как-нибудь её отключить, если есть исходники. Или как вариант в perldoc IPC::Open2 в конце встречается такое:</font></div>
<div style=""><font face="arial, sans-serif"><div><br></div><div>The big problem with this approach is that if you don't have control over source code being run in the child process, you can't control what it does with pipe buffering.</div>
<div><br></div><div>The IO::Pty and Expect modules from CPAN can help with this, as they provide a real tty (well, a pseudo-tty, actually), which gets you back to line buffering in the invoked command again.</div></font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">27 июня 2013 г., 15:42 пользователь alpha6 <span dir="ltr"><<a href="mailto:denis.fedoseev@gmail.com" target="_blank">denis.fedoseev@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Доброго времени суток, камрады.<br>
<br>
Требуется совет коллективного разума :)<br>
Задача: есть у меня демон на AE который запускает кучу процессов, следит за их жизнью и пишет вывод их STDOUT в лог-файлы. Процессы большие, тяжелые и не перловые.<br>
<br>
Проблема заключается в том, что при запуске через IPC::Open2 я не могу читать STDOUT этих самых запущенных процессов в процессе их работы. AE::Handle просто не реагирует на появление новых данных. Попытки читать через sysread приводят к блокировке приложения до конца работы читаемого процесса в силу особенностей IPC::Open2. Сейчас я обошел эту проблему так - ожидаю пока процесс завершится и считываю его вывод целиком в файл. Но такой метод не очень хорош т.к. процессы могут работать более часа и хочется видеть чего с ним происходит в реальном времени.<br>

<br>
В общем, хочется узнать у сообщества кто как справляется с такими задачами? И как вообще это нужно делать по канонам :)<br>
<br>
С уважением,<br>
Денис Федосеев<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div><br></div>
-- <br>Moscow.pm mailing list<br><a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org">http://moscow.pm.org</a><br></blockquote></div><br></div></body></html>