Overvåke endringer i log filer

Kategori overført fra Linux1

Overvåke endringer i log filer

Innleggav Lurky » man 06.08.2007 12:33

Jeg driver å lærer meg C for tiden. Og den beste måten å gjøre dette på synes jeg er å ha et prosjekt. Så det jeg hadde tenkt å lage er en server applikasjon som overvåker logger for endringer og sender endringene til en klient som er koblet til serveren.

Nå har jeg fått laget grunnlaget for serveren, og tenkte jeg skulle begynne å se på åssen jeg kan overvåke log filene. Det jeg har kommet fram til så langt er:

Kode: Merk alt
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
  struct stat file_status;
  int s = 0;
 
  while (1) {
      if (stat("text.txt", &file_status) != 0) {
         perror("stat");
      }
     
      if (file_status.st_size != s) {
         printf("File changed, new size: %d\n", file_status.st_size);
         s = file_status.st_size;
      }
  }
 
  return 0;
}


Denne gjør forsovit jobben sin, men den bruker opp 100% av cpu'en. Det har vel noe med loopen å gjøre, men jeg klarer ikke å finne noen annen løsning for å kunne kjøre denne overvåkningen på.

Noen som har et forslag på åssen jeg kan få denne til å sjekke størrelsen på filen uten å bruke opp 100% av cpu'en? Evt. en annen måte å sjekke størrelsen på uten å bruke "stat"?
medlem i 206 måneder
 

Innleggav ehh » man 06.08.2007 12:42

Inotfy er laget for nettopp dette. Det varsler når endringer i filer eller kataloger skjer.

http://www.linuxjournal.com/article/8478
Sist endret av ehh den man 06.08.2007 12:44, endret 1 gang

Brukerens avatar
medlem i 228 måneder
 

Innleggav art3mis » man 06.08.2007 12:42

Kanskje legge inn en liten forsinkelse?

Aner ikke noe om hvor vanskelig dette er, men kjernen har også noe som heter inotify som sier fra om endringer i filer. Aner derimot ikke hvordan dette funker, la bare merke til når jeg compilet kernelen.

Edit: ehh kom meg visst i forkjøpet.

Edit2:
Haha: http://www.kernel.org/pub/linux/kernel/ ... ify/README

Brukerens avatar
medlem i 222 måneder
 

Innleggav ehh » man 06.08.2007 12:50



Hehehe, flirte godt av denne:
* Rumor is that the "d" in "dnotify" does not stand for "directory" but for
"suck."

Brukerens avatar
medlem i 228 måneder
 

Innleggav geirendre » man 06.08.2007 12:50

Fra IBM: [url=http://www-128.ibm.com/developerworks/linux/library/l-inotify.html]Inotify.
[/url]
:-)

Erfaren
Brukerens avatar
medlem i 231 måneder
 

Innleggav ehh » man 06.08.2007 12:54

geirendre skrev:Fra IBM: [url=http://www-128.ibm.com/developerworks/linux/library/l-inotify.html]Inotify.
[/url]
:-)


I følge Wikipedia er denne artikkelen utdatert. Bare et lite varsku :-)

Brukerens avatar
medlem i 228 måneder
 

Innleggav Lurky » man 06.08.2007 13:27

Vel, poenget var jo at jeg skulle laget dette selv. Trengte bare litt tips om åssen jeg kunne gjøre det :)

Selve systemet jeg lager finnes det sikkert flere av fra før, men siden jeg skulle ha dette prosjektet for å lære meg C så så spiller det ingen rolle.
medlem i 206 måneder
 

Innleggav ehh » man 06.08.2007 13:30

Lurky skrev:Vel, poenget var jo at jeg skulle laget dette selv. Trengte bare litt tips om åssen jeg kunne gjøre det :)


Misforsto vi hverandre nå?

Inotify er bare systemkall for å si at du vil ha beskjed om når filer endres. Du må fortsatt skrive alt rundt selv. :)

Inotify-bruk vil oppnå akkurat det samme du gjør nå, bare at du slipper å «polle» så og så ofte.

Brukerens avatar
medlem i 228 måneder
 

Innleggav tactus » man 06.08.2007 13:38

Har veldig lite erfaring med C/C++, men hva med..

Kode: Merk alt
while(1) {
// gjøre noe..
sleep(n);
}


Oppdatert: Kan hende du trenger å #include noe. Denne siden foreslår "unistd.h".

Brukerens avatar
medlem i 229 måneder
 

Innleggav ehh » man 06.08.2007 13:56

tactus skrev:Oppdatert: Kan hende du trenger å #include noe. Denne siden foreslår "unistd.h".


Stemmer. Slikt kan en finne ut ved å skrive man 3 [funksjonsnavn] hvis manpages-dev er installert.

Brukerens avatar
medlem i 228 måneder
 

Innleggav Lurky » man 06.08.2007 14:14

Jeg har tenkt på det med å bruke sleep, men det igjen vil vel skape problemer for "server" biten som ligger å venter på tilkoplinger i fra en klient? Siden de ligger i samme loop.
medlem i 206 måneder
 

Innleggav ak » man 06.08.2007 14:36

Istedet for sleep kan du blokkere mens du venter på å motta en pakke, men også har et tidsavbrudd. Da vil den våkne når den mottar en pakke, eller når tiden går ut.

Men som flere andre har sagt her: inotify er den riktige løsningen, hvis du skriver et program som hele tiden sjekker loggfilen så lager du et program som er mindre effektiv og du får en unødvendig forsinkelse mellom det skjer noe og når beskjeden går ut.

Du gjør like mye selv når du bruker inotify som når du bruker alternativet ovenfor.

Administrator
Brukerens avatar
medlem i 237 måneder
 


Returner til Utvikling i Linux



Hvem er i Forumene

Registrerte brukere: Google [Bot]