2008-10-29 6 views

Répondre

2

Bien qu'il ait consommé les lignes à d'autres fins, j'ai écrit un code qui le fait essentiellement avant.

Tout ce que vous devez faire est d'enregistrer l'octet de décalage (avec dire) et inode (avec stat) pour chaque fichier après la queue terminée. La prochaine fois qu'il est exécuté sur le fichier, vérifiez d'abord l'inode (avec stat). Si l'inode a changé ou si le fichier est plus petit que le décalage enregistré, alors c'est un fichier différent (supprimé et recréé, le journal a été pivoté, etc.), vous devriez donc le montrer depuis le début; sinon, recherche au décalage enregistré et affiche-le à partir de là.

2

since fait exactement que bien qu'il soit en C.

+0

Vous auriez pu modifier votre question. – Axeman

2

peut être ce paquet Perl peut vous aider:

File::Tail::Multi

Dérivé de MultiTail, cette bibliothèque Perl facilite la queue une dynamique liste de fichiers et match/excepté les lignes utilisant des expressions régulières complètes et maintient même leur état localement.

EXEMPLE use Fichier :: Tail :: Multi;

$tail1=File::Tail::Multi->new ( OutputPrefix => "f", 
           Debug => "$True", 
           Files => ["/var/adm/messages"] 
          ); 
while(1) { 
    $tail1->read; 
    # 
    $tail1->print; 
    sleep 10; 
} 
  • $tail1=File::Tail::Multi->new: Créer un nouveau objet ptail
  • Files => Fichier Queue/var/adm/messages
  • OutputPrefix => préfixer le nom du début de fichier de chaque ligne dans l'attribut d'objet « LineArray
  • $tail1->read: Lire toutes les lignes des fichiers
  • $tail1->print: Imprimer toutes les lignes dans l'attribut d'objet "LineArray";
+0

C'est * obtenu * pour être la réponse perl! – Axeman

+0

Ici l'état est maintenu, mais seulement dans une exécution du programme. J'aimerais que l'état soit sauvegardé dans les exécutions de programme. –

2

I mis en œuvre une version minimale d'une pure version Perl:

#! /usr/bin/perl 
# Perl clone of since(1) 
# http://welz.org.za/projects/since 
# 

use strict; 
use warnings; 

use Fcntl qw/ SEEK_SET O_RDWR O_CREAT /; 
use NDBM_File; 

my $state_file = "$ENV{HOME}/.psince"; 

my %states; 
tie(%states, 'NDBM_File', $state_file, O_CREAT | O_RDWR, 0660) 
     or die("cannot tie state to $state_file : $!"); 

while (my $filename = shift) { 
     if (! -r $filename) { 
       # Ignore 
       next; 
     } 
     my @file_stats = stat($filename); 
     my $device = $file_stats[0]; 
     my $inode = $file_stats[1]; 
     my $size = $file_stats[7]; 
     my $state_key = $device . "/" .$inode; 
     print STDERR "state_key=$state_key\n"; 

     if (! open(FILE, $filename)) { 
       print STDERR "cannot open $filename : $!"; 
       next; 
     } 

     # Reverting to the last cursor position 
     my $offset = $states{$state_key} || 0; 
     if ($offset <= $size) { 
       sysseek(FILE, $offset, SEEK_SET); 
     } else { 
       # file was truncated, restarting from the beginning 
       $offset = 0; 
     } 

     # Reading until the end 
     my $buffer; 
     while ((my $read_count = sysread(FILE, $buffer, 4096)) > 0) { 
       $offset += $read_count; 
       print $buffer; 
     } 
     # Nothing to read 
     close(FILE); 
     $states{$state_key} = $offset; 
} 

# Sync the states 
untie(%states); 

@ Dave: Il est presque comme votre algorithme, sauf que je ne me dire, mais un compteur interne maintenu.

Questions connexes