Strona 1 z 1

¦ledzenie zmian w pliku

: 20 sierpnia 2008, 10:30
autor: janiewiem
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?

: 20 sierpnia 2008, 10:32
autor: nick12345
A w czym chcesz to zrobić?

: 20 sierpnia 2008, 10:36
autor: janiewiem
Wlasciwie to nie wiem, myslalem o jakims skrypcie w bashu, lub jesli jest jakis gotowy program ktory mialby takie mozliwosci to moglby byc.

: 20 sierpnia 2008, 11:24
autor: taa, jaasne
może gamin (lub starszy FAM)? > http://www.gnome.org/~veillard/gamin/index.html

: 20 sierpnia 2008, 13:47
autor: janiewiem
jedynie konsola wchodzi w gre :/

: 21 sierpnia 2008, 09:12
autor: lessmian2
Witam
Jak Cię zainteresuję to przygrzebałem Ci mini-demona ;-)

Kod: Zaznacz cały

#!/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 ;-)

: 28 sierpnia 2008, 10:47
autor: melonlm
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!

: 28 sierpnia 2008, 13:25
autor: mlyczek
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.