[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