2016-10-16 5 views
0

EHLO!fichier queue Perl pendant 30 secondes

Cela a commencé comme un « bon, donnez-moi 30 minutes », mais ici je suis un jour après. Fondamentalement, ce que je veux faire est de vérifier «/var/log/messages » pendant 30 secondes et quand quelqu'un plug-in d'un disque dur USB pendant ce temps, d'exécuter certaines commandes.

Donc j'utilise Par la fonction "File :: Tail", et fonctionne un peu mais je ne sais pas comment l'exécuter pendant seulement 30 secondes, la queue reste là jusqu'à ce que je sois sortie manuellement ( Il fonctionne juste comme commande de queue). Je cherchais des solutions en utilisant la fourche mais toujours pas de chance ou d'expérience à ce sujet. Une partie du code « queue » est comme ceci:

while ((defined($line=$file->read))) {

J'apprécie toute aide ou un conseil. Si quelqu'un a une autre solution en utilisant un autre, une fonction ou quoi que ce soit, c'est bien, j'ai besoin du code pour un "CGI".

+3

['alarm'] (http://perldoc.perl.org/functions/alarm.html)? – mob

+2

'sommeil (30),' 'avant d'appeler $ file-> read';) – ikegami

+3

F :: T ne supporte pas que, si vos options sont les suivantes: 1) Recherche d'un module qui fait la même chose que F: : T, mais supporte un timeout 2) Monkeypatch F :: T 3) Réimplement F :: T avec la possibilité d'expirer, 4) 'alarm' 5) Utiliser un mécanisme qui n'implique pas'/var/log/messages ' – ikegami

Répondre

1

Vous pouvez y parvenir en utilisant File::Tail::select().

L'exemple ci-dessous met une seconde valeur du fichier tailed dans le tableau @pending qui est ensuite traitée. Looping 30 fois vous donnera très près de 30 secondes (dépend de l'activité de votre/var/log/messages). Si vous avez besoin d'un timing plus précis, vous pouvez stocker le temps avant la boucle et comparer le temps écoulé à chaque itération.

use File::Tail; 
$file = File::Tail->new(name=>"/var/log/messages", interval=>1); 

TIMER_LOOP: 
while($t++ < 30){ 
    (undef,undef,@pending)=File::Tail::select(undef,undef,undef, 1, $file); 
    for(@pending){ 
     if($_->read =~ /New USB device found/){ 
      print "Hello USB!\n"; 
      last TIMER_LOOP; 
     } 
    } 
}