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

Sergei Olonichev olonichev at scnsoft.com
Fri Apr 25 16:22:50 MSD 2003


Anton Farygin wrote:

> Sergei Olonichev пишет:
>
>> Alexander Bokovoy wrote:
>>
>>> On Fri, Apr 25, 2003 at 12:14:29PM +0300, Sergei Olonichev wrote:
>>>  
>>>
>>>>>> 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 
>>>> адресов
>>>>
>>>> Тогда вам не придеться запускать пайп для каждого адреса.
>>>>   
>>>
>>>
>>> А зачем вообще запускать внешний grep? Сергей, ты не объяснишь мне, что
>>> такое реально лучшее от этого будет?
>>>  
>>>
>> По-моему так поще - потому что эту команду можно отладить отдельно от 
>> всей программы.
>> А во-вторых я не вижу ничего плохого в использовании стандартных 
>> средств совместно с Ruby.
>
>
> Это несколько не вместе.
>
> Т.е. - получается, что для того, что бы получить набор данных по 
> нужному нам списку IP адресов мы должны:
>
> 1) Сформировать большое регулярное выражение
> 2) открыть pipe на grep
> 3) Забрать оттуда данные
>
> Вариант, который обсуждался ранее:
>
> 1) Открыть pipe на iptables
> 2) читать из pipe, обрабатывая регулярным выражением для каждого 
> адреса из списка
>
> Мне кажется второй вариант несколько проще и быстрее.
>
> Rgds,
> Rider
>

Вообще-то я просто неправильно понял и подумал, что iptables вызывается 
для каждого адреса, а то бы не предлагал. Но всеравно я счмитаю, что 
использовать:

ipt1=ipt.grep(/192.168.1.244/)

не лучшее решение, т.к. для каждого шаблона приходится порсматривать 
_весь_ текст заново.
А что если iptables вернет 1000 строк и у вас будет 1000 адресов, то ваш 
алгоритм (если я не ошибаюсь) сделает 10^6 итераций, а мой 10^3.

Так что это ваш алгоритм медленее.

а сформировать общее регулярное выражение - не проблема темболее что это 
делается один раз при зачитке кофигурационного файла






More information about the Ruby mailing list