[Ruby] Re: [Ruby] Re: [Ruby] IO.popen("cmd").readlines.grep(/str/) оставляет зомби
Sergei Olonichev
olonichev at scnsoft.com
Fri Apr 25 13:14:29 MSD 2003
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).
2. в руби просто строить hash: ip->info для всех возращаемых ip адресов
Тогда вам не придеться запускать пайп для каждого адреса.
More information about the Ruby
mailing list