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?
¦ledzenie zmian w pliku
-
- Posty: 19
- Rejestracja: 06 kwietnia 2008, 22:29
może gamin (lub starszy FAM)? > http://www.gnome.org/~veillard/gamin/index.html
Witam
Jak Cię zainteresuję to przygrzebałem Ci mini-demona ;-)
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 ;-)
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];
}
Jeśli trzeba by coś zmienić to pisz, się zmieni ;-)
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!
powodzenia!
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.