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
Author: Jarosław Lubczyński
Date: Tue, 07 Dec 2010 14:42
Date: Tue, 07 Dec 2010 14:42
82 lines
3611 bytes
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
Author: Adam Osuchowski
Date: Tue, 07 Dec 2010 17:55
Date: Tue, 07 Dec 2010 17:55
7 lines
1166 bytes
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
Author: Jarosław Lubczyński
Date: Tue, 07 Dec 2010 18:07
Date: Tue, 07 Dec 2010 18:07
19 lines
1699 bytes
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
Author: hubert depesz lubaczewski
Date: Tue, 07 Dec 2010 20:18
Date: Tue, 07 Dec 2010 20:18
16 lines
1498 bytes
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
Author: Tomasz "rocku" K.
Date: Wed, 08 Dec 2010 11:10
Date: Wed, 08 Dec 2010 11:10
18 lines
1784 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 09 Dec 2010 14:39
Date: Thu, 09 Dec 2010 14:39
32 lines
2098 bytes
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
Author: Stachu 'Dozzie' K.
Date: Thu, 09 Dec 2010 14:52
Date: Thu, 09 Dec 2010 14:52
35 lines
2433 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 09 Dec 2010 14:57
Date: Thu, 09 Dec 2010 14:57
49 lines
2705 bytes
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
Author: felippe
Date: Sun, 12 Dec 2010 18:36
Date: Sun, 12 Dec 2010 18:36
1 lines
1399 bytes
1399 bytes
A są jakieś przeciwwskazania, by używać po prostu crona?
Re: Przeglądanie drzewa katalogów w poszukiwaniu pliku
Author: Jarosław Lubczyński
Date: Tue, 14 Dec 2010 06:43
Date: Tue, 14 Dec 2010 06:43
17 lines
1792 bytes
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