2016-10-16 1 views
0

EHLO!Perlendatei für 30 Sekunden

Das begann wie ein "hey, gib mir 30 Minuten" aber hier bin ich einen Tag danach. Grundsätzlich möchte ich "/ var/log/messages" für 30 Sekunden überprüfen und wenn jemand während dieser Zeit eine USB-Festplatte einsteckt, einige Befehle ausführen.

Also ich benutze Per Funktion "File :: Tail", und irgendwie funktioniert, aber ich weiß nicht, wie es für nur 30 Sekunden, Schwanz bleibt dort, bis ich manuell zu beenden ( Es funktioniert nur als Schwanz Befehl). Ich suchte nach Lösungen mit Gabel aber immer noch kein Glück oder Erfahrung darin. Ein Teil des „Schwanz“ Code ist wie folgt:

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

ich Hilfe oder Spitze zu schätzen wissen. Wenn jemand eine andere Lösung mit einer anderen, Funktion oder was auch immer verwendet, ist es in Ordnung, ich brauche den Code für ein "CGI".

+3

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

+2

'sleep (30);' Bevor Sie '$ file-> read' aufrufen;) – ikegami

+3

F :: T unterstützt das nicht, also haben Sie folgende Optionen: 1) Suchen Sie nach einem Modul, das dasselbe wie F tut: : T, aber unterstützt eine Zeitüberschreitung 2) Monkeypatch F :: T 3) Reimplementierung von F :: T mit der Möglichkeit zum Timeout, 4) 'alarm' 5) Verwenden Sie einen Mechanismus, der'/var/log/messages nicht beinhaltet ' – ikegami

Antwort

1

Sie können dies unter Verwendung File::Tail::select() erreichen.

Im folgenden Beispiel wird die Tailed-Datei im Wert von 1 Sekunde in das @pending-Array eingefügt, das dann verarbeitet wird. Wenn Sie 30 Mal schleifen, werden Sie fast 30 Sekunden lang (abhängig davon, wie aktiv Ihre/var/log/messages sind). Wenn Sie ein genaueres Timing benötigen, können Sie die Zeit vor der Schleife speichern und vergleichen, wie lange jede Iteration verstrichen ist.

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; 
     } 
    } 
} 
Verwandte Themen