🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
10 messages
10 total messages Started by Jarosław Lubczyński Tue, 07 Dec 2010 14:42
Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52099
Author: Jarosław Lubczyński
Date: Tue, 07 Dec 2010 14:42
82 lines
3611 bytes
Witam ponownie :)

Problem wygląda tak:
Mam następujące (przykładowe) drzewo katalogów (start od pewnego 
katalogu bieżącego, dowolny (no, prawie :) ) rozmiar struktury:

my @DirTree = qw
{
     A
     A/B1
     A/B1/C1
     A/B1/C2
     A/B2
     A/B2/C1
     A/B2/C1/D1
     A/B2/C1/D2
};

W dowolnym katalogu z listy może pojawić się od czasu do czasu plik o 
znanej nazwie, powiedzmy:

Readonly my $FileName => 'findme.txt';

Zadanie mam takie: po pojawieniu się pliku możliwie jak najszybciej 
wykonać na nim określoną operację, plik usunąć i czekać na kolejne 
pojawienie się pliku o takiej samej nazwie - być może w innym miejscu 
struktury katalogów.

Rozwiązanie jest niby proste (sprawdzanie co 5 sekund, opóźnienie do 
przyjęcia):

while( 1)
{
     foreach my $Path ( @DirTree)
     {
         fileAction( $Path) if( -f "$Path/$FileName");
     }
     sleep( 5);
}

sub fileAction
{
     my( $Path) = @_;
     my $FilePath = "$Path/$FileName";
     # do sth on $Path and/or $FilePath ....
     unlink $FilePath;
}

Taki też mniej więcej kod zmajstrowałem. Działa bez zarzutu. Niestety 
top melduje, że mój program zajmuje niepotrzebnie czas procesora - jeden 
z trzech na liście od góry, co prawda tylko na poziomie 0.5..1% użycia 
CPU na moim laptopie (CentOS 5.4 pod VMWare na WinXP SP2 z P4/2.4GHz, 
Perl 5.8.8) ale to wystarczy by użytkownik trochę marudził.

W zasadzie maruda ma rację - pliki o wskazanej nazwie mogą pojawiać się 
stosunkowo rzadko (powiedzmy, że raz na tydzień) więc zastosowany 
algorytm pollingowy zupełnie niepotrzebnie (chociaż w niewielkim 
stopniu) bezustannie obciąża system.

No i teraz pytanie zasadnicze: czy istnieje mechanizm (lub gotowy pakiet 
CPAN), który wygeneruje mi zdarzenie na wyżej opisaną okoliczność?

Spróbowałem POE::Component::DirWatch ale wygląda, że pakiet ten też 
stosuje polling niestety. Przykładowy kod z ww pakietu obserwujący tylko 
jeden katalog obciąża mi system w podobnym stopniu jak powyższy kawałek 
programu. Doinstalowałem IO::AIO - wygląda, że bez zmian, ale nie wiem 
czy DirWatch go wykorzystuje (powinien automagicznie).

Wersję z File::Find też napisałem, z podobnym skutkiem.

Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu 
się pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie 
wsparcie? A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.

-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52100
Author: Adam Osuchowski
Date: Tue, 07 Dec 2010 17:55
7 lines
1166 bytes
Jarosław Lubczyński wrote:
> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się 
> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie? 
> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.

Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
na ile są sprawne.
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52101
Author: Jarosław Lubczyński
Date: Tue, 07 Dec 2010 18:07
19 lines
1699 bytes
W dniu 2010-12-07 18:55, Adam Osuchowski pisze:
> Jarosław Lubczyński wrote:
>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się
>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie?
>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>
> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
> na ile są sprawne.

Już widzę, poczytam troszeczkę, zainstaluję, test prawdę mi powie, dzięki :)

-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52102
Author: hubert depesz lubaczewski
Date: Tue, 07 Dec 2010 20:18
16 lines
1498 bytes
On 2010-12-07, Adam Osuchowski <someone@somewhere.com> wrote:
> Jarosław Lubczyński wrote:
>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się 
>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie? 
>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>
> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
> na ile są sprawne.

polecam "incron".

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52103
Author: Tomasz "rocku" K.
Date: Wed, 08 Dec 2010 11:10
18 lines
1784 bytes
W dniu 07.12.2010 18:55, Adam Osuchowski pisze:
> Jarosław Lubczyński wrote:
>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się
>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie?
>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>
> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
> na ile są sprawne.

Jak używałem inotify w projekcie parę lat temu, to nie wyrabiał się gdy 
pojawiało się zbyt wiele plików. Zdarzenia zwyczajnie nie dochodziły. 
Nie był to jednak błąd w module Perlowym. W programie napisanym w C 
działo się dokładnie to samo. Być może poprawili to już do tego czasu, 
ja ostatecznie zdecydowałem się nie użyć inotify.

-- 
Pozdrawiam,
Tomasz "rocku" K.
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52104
Author: Jarosław Lubczyński
Date: Thu, 09 Dec 2010 14:39
32 lines
2098 bytes
W dniu 2010-12-07 18:55, Adam Osuchowski pisze:
> Jarosław Lubczyński wrote:
>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się
>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie?
>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>
> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
> na ile są sprawne.

Na razie sprawdziłem Linux::Inotify dla jadnego katalogu, wygląda 
zachęcająco, chociaż wieczorkiem potestuję Linux::Inotify2 jako bardziej 
mi pasujący.

Inotify ma wsparcie od kernela 2.6.13 więc gdybym przypadkiem zapuszczał 
program na starszej maszynie to muszę wrócić do pollingu. W związku z 
tym mam pytanie: jak najprościej sprawdzić wersję kernela linuksowego? 
Czy jest coś bardziej eleganckiego od

`cat /proc/version` =~ m!(\d+\.\d+\.\d+)!;
print( "$1\n");

?


-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52105
Author: Stachu 'Dozzie' K.
Date: Thu, 09 Dec 2010 14:52
35 lines
2433 bytes
On 2010-12-09, Jarosław Lubczyński <guess@who.com.pl> wrote:
> W dniu 2010-12-07 18:55, Adam Osuchowski pisze:
>> Jarosław Lubczyński wrote:
>>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się
>>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie?
>>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>>
>> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
>> na ile są sprawne.
>
> Na razie sprawdziłem Linux::Inotify dla jadnego katalogu, wygląda 
> zachęcająco, chociaż wieczorkiem potestuję Linux::Inotify2 jako bardziej 
> mi pasujący.
>
> Inotify ma wsparcie od kernela 2.6.13 więc gdybym przypadkiem zapuszczał 
> program na starszej maszynie to muszę wrócić do pollingu.

Dnotify? man 2 fcntl, F_NOTIFY

> W związku z 
> tym mam pytanie: jak najprościej sprawdzić wersję kernela linuksowego? 

POSIX::uname()?

> Czy jest coś bardziej eleganckiego od
>
> `cat /proc/version` =~ m!(\d+\.\d+\.\d+)!;
> print( "$1\n");

A fuj. Co to, Perl już nie umie otworzyć pliku? Trzymaj się z dala od
backticków, to jest Zły Nawyk[tm].

-- 
Secunia non olet.
Stanislaw Klekot
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52106
Author: Jarosław Lubczyński
Date: Thu, 09 Dec 2010 14:57
49 lines
2705 bytes
W dniu 2010-12-09 15:52, Stachu 'Dozzie' K. pisze:
> On 2010-12-09, Jarosław Lubczyński<guess@who.com.pl>  wrote:
>> W dniu 2010-12-07 18:55, Adam Osuchowski pisze:
>>> Jarosław Lubczyński wrote:
>>>> Jakie mam inne opcje? Mam niejasne wrażenie, że zdarzenie o pojawieniu się
>>>> pliku powinnno wstępnie przyjść od kernela. Czy Linux daje takie wsparcie?
>>>> A Perl je obsługuje? Kernel 2.6.18, Perl 5.8.8 jak wspomniałem.
>>>
>>> Inotify. Widze, że nawet jest parę modułów do tego na CPANie ale nie wiem
>>> na ile są sprawne.
>>
>> Na razie sprawdziłem Linux::Inotify dla jadnego katalogu, wygląda
>> zachęcająco, chociaż wieczorkiem potestuję Linux::Inotify2 jako bardziej
>> mi pasujący.
>>
>> Inotify ma wsparcie od kernela 2.6.13 więc gdybym przypadkiem zapuszczał
>> program na starszej maszynie to muszę wrócić do pollingu.
>
> Dnotify? man 2 fcntl, F_NOTIFY
>
>> W związku z
>> tym mam pytanie: jak najprościej sprawdzić wersję kernela linuksowego?
>
> POSIX::uname()?

Dzięki :)

>
>> Czy jest coś bardziej eleganckiego od
>>
>> `cat /proc/version` =~ m!(\d+\.\d+\.\d+)!;
>> print( "$1\n");
>
> A fuj. Co to, Perl już nie umie otworzyć pliku? Trzymaj się z dala od
> backticków, to jest Zły Nawyk[tm].
>


Przyjąłem :). Chodziło mi raczej o to czy mam czesać /proc/version czy 
jest inny sposób. Ten powyżej zaraz sprawdzę, dzięki jeszcze raz/.

-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52107
Author: felippe
Date: Sun, 12 Dec 2010 18:36
1 lines
1399 bytes
A są jakieś przeciwwskazania, by używać po prostu crona?
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
#52108
Author: Jarosław Lubczyński
Date: Tue, 14 Dec 2010 06:43
17 lines
1792 bytes
W dniu 2010-12-12 19:36, felippe pisze:
> A są jakieś przeciwwskazania, by używać po prostu crona?

Są :). Opisane zagadnienie jest tylko małym elementem całkiem sporej 
(jak dla mnie ;-) ) aplikacji napisanej w Perlu. Zresztą przetestowałem 
już pakiet Linux::Inotify2 i wygląda, że jest tym jakiego poszukiwałem. 
Dodanie całego mechanizmu do programu zajmie mi teraz tak pi * oko 
~naście linijek kodu, muszę tylko chwilę czasu znaleźć :).

-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads