|
¦ledzenie zmian w pliku
janiewiem - 20-08-2008 10:30
Witam serdecznie kochane grono :)
Wiec kolejny z moich problemow jawi sie nastepujaco:
1. Mam program ktory pozwala na powiedzmy rejestracje nowych uzytkownikow, pobiera od nich 3 zmienne, login, mail i haslo i zapisuje je w pliku PLIK.txt w formacie Mail#user#haslo tak wyglada kazda linijka tego pliku.
2. Chodzi mi teraz o to, zeby za kazdym razem kiedy user sie zarejestruje i jednoczesnie zostanie dopisana nowa linjka do tego pliku, zewnetrzny skrypt ktory caly czas obserwowalby ten plik.txt wysylal maila na podany adres z potwierdzeniem rejestracji.
3. Moj problem polega na tym ze nie wiem czego moznaby uzyc do sledzenia tego pliku. Wiem juz jak wydobyc poszczegolne dane (za pomoca 'awk'), wiem jak przekazac do skryptu ostatnia linijka tego pliku (tail -n 1), ale nie mam pojecia czego uzyc do monitorowania, zeby mail byl wysylany od razu jak tylko dodana zostanie linijka do pliku. Jakies wskazowki?
nick12345 - 20-08-2008 10:32
A w czym chcesz to zrobiæ?
janiewiem - 20-08-2008 10:36
Wlasciwie to nie wiem, myslalem o jakims skrypcie w bashu, lub jesli jest jakis gotowy program ktory mialby takie mozliwosci to moglby byc.
taa, jaasne - 20-08-2008 11:24
mo¿e gamin (lub starszy FAM)? > http://www.gnome.org/~veillard/gamin/index.html
janiewiem - 20-08-2008 13:47
jedynie konsola wchodzi w gre :/
lessmian2 - 21-08-2008 09:12
Witam Jak Ciê zainteresujê to przygrzeba³em Ci mini-demona ;-) #!/usr/bin/perl
$path="/path/to/file"; #sciezka do obserwowanego pliku $time=3; #czas co jaki ma sprawdzac plik
$rozmiar=&proc_rozmiar($path); #inicjacja zmiennej
while (1) { $rozmiar_new=&proc_rozmiar($path); if ($rozmiar_new>$rozmiar) { print "Nastapila zmiana, plik ma teraz $rozmiar_new linii\n"; $ost=`tail -n 1 $path`; print "Ostatnia linia to : $ost\n"; &proc_podzial($ost); print "Mail :: $mail, User :: $user; Pass :: $pass\n"; $rozmiar=$rozmiar_new; ############################################ #tu mozna wstawic polecenie wysylajace maila ############################################ } else { print "Bez zmian, plik ma wciaz $rozmiar linii\n"; } sleep $time; }
sub proc_rozmiar { #procedura sprawdza ilosc linii w pliku $rozm=`wc -l $path`; @rozm=split(' ', $rozm); $rozm=@rozm[0]; }
sub proc_podzial { #procedura dzieli linie na poszczegolne pola @pola=split('#',$ost); $mail=$pola[0]; $user=$pola[1]; $pass=$pola[2]; }
Taki ma³y skrypcik w Perlu. Pewnie mo¿na by³o to zrobiæ inaczej, ale akurat mia³em tak± inwencjê. Odpala siê go w tle, sprawdza co n sekund czy zmieni³a siê ilo¶æ linii w podanym pliku. Linie z printami mo¿na wywaliæ, tak tylko pokazowo s± wstawione. W zaznaczonym miejscu trzeba wstawiæ polecenie wysy³aj±ce maila i gotowe. Je¶li trzeba by co¶ zmieniæ to pisz, siê zmieni ;-)
melonlm - 28-08-2008 10:47
Zainteresuj siê mechanizmem "inotify" j±dra. Pozwala on na zadanie listy plików i katalogów do obserwowania i j±derko bêdzie mówi³o ci o ka¿dej zmianie :). Pozwala unikaæ aktywnego czekania i pollingu (okresowego sprawdzania). Niestety nie mogê podaæ ci kodu bo le¿y "na kopyrajcie" u by³ego pracodawcy :(. Perl ma bibliotekê do inotify i napisanie demona zajmie ci chwilê. Poza tym jest pakiet " inotify-tools" w Debianie, który pozwoli ci na zrobienie tego z basha
powodzenia!
mlyczek - 28-08-2008 13:25
Mo¿na jeszcze sprawê rozwi±zaæ tak, ¿e program, który pobiera dane od u¿ytkownika i dopisuje linijkê do pliku bêdzie wysy³a³ maila do tej osoby po zarejestrowaniu uzytkownika. Nie musisz wtedy monitorowaæ ca³y czas tego pliku, pisaæ demona itp., bo mail bedzie wysy³any dok³adnie wtedy, kiedy u¿ytkownik siê zarejestruje.
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|