[Ruby] Re: [Ruby] Re: [Ruby] IO.popen("cmd").readlines.grep(/str/) оставляет зомби

vic ismakaev viclists at mail.esoo.ru
Fri Apr 25 14:23:02 MSD 2003


25 Апрель 2003 15:14, Sergei Olonichev написал:
> vic ismakaev wrote:
> >25 Апрель 2003 12:16, Sergei Olonichev написал:
> >>vic ismakaev wrote:
> >>>22 Апрель 2003 21:56, vic ismakaev написал:
> >>>>22 Апрель 2003 21:50, Alexander Bokovoy написал:
> >>>>>On Tue, Apr 22, 2003 at 09:42:24PM +0600, vic ismakaev wrote:
> >>>>>>Приветствую!
> >>>>>>Снова я с тупым вопросом.
> >>>>>>Например,когда в цикле каждую секунду я пытаюсь выполнить оперцию
> >>>>>> вида
> >>>>>>
> >>>>>>ipt=IO::popen("iptables -nvL
> >>>>>> FORWARD").readlines.grep(/192.168.1.244/)
> >>>>>>
> >>>>>>то у меня катастрофически растет количство зомби-процессов.
> >>>>>>С чем это может быть связано и что я делаю не так?
> >>>>>
> >>>>>С тем, что IO#popen порождает IO-объект, который не уничтожается.
> >>>>>Попробуйте вариант с блоком.
> >>>>
> >>>>Придется наверное.Хотя без него дюже красиво получается.
> >>>>
> >>>>Для IO есть методы close,но вот не соображу,куда мне его вызов
> >>>> поместить.
> >>>
> >>>Переписал код таким макаром
> >>>
> >>>ipt=IO::popen("iptables -nvL FORWARD")
> >>>ipt1=ipt.grep(/192.168.1.244/)
> >>>ipt.close_read
> >>>
> >>>Вроде теперь не зомбится.
> >>
> >>1. А почему нельзя использовать стандартный grep? Зачем изобретать
> >>велосипеды?
> >>2. Наверное вы хотели написать /192[.]168[.]1[.]244/ а не /192.168.1.244/
> >> ?
> >>
> >>ipt=IO::popen("iptables -nvL FORWARD | grep /192[.]168[.]1[.]244/")
> >
> >Системный греп не подходит,поскольку iptables|grep придется  вызывать на
> >каждый ИП-адрес.
> >А так я все считываю в буфер и разбираю уже средствами руби.быстрее
> >получается.
>
> Если у вас много ip адресов то оба эти метода практически одинаково
> неэффективны.
>
> Я бы посоветовал :
>
> 1. построить _одно_ регулярное выражение для _всех_ ip адресов, а потом
> запускать iptables + grep (egrep).
Не пройдет.Набор IP-адресов у меня может менятся.Прописал админ доступ 
комуто,добавились правила iptables,изменились критерии отбора адресов.
Поэтому я сделал так - список открытых адресов храниться в хэше вида
ipaddr=>[массив ныжных мне полей].
Добавляю/удаляю нужные адреса в/из хэша и одновременно в/из iptables-chains.
Потом все что есть,считываю по iptbles -nvL и разбираю уже в памяти.
Так ,мне кажется,меньше накладных расходов на системные операции.
> 2. в руби просто строить hash: ip->info для всех возращаемых ip адресов
>
> Тогда вам не придеться запускать пайп для каждого адреса.
А у меня он вроде и так один только.

-- 
С уважением
Виктор В Исмакаев



More information about the Ruby mailing list