Programm am Leben erhalten

Hallo,
in meinem Perl-Skript habe ich folgendes Konstrukt um eine Datei auszulesen:

open IN, "exec tail -f /home/kave/abar/data |";
while (<IN>) {
... do calculations
}

Problem ist nun, dass es ab und an zu Fehlern beim tail kommt (broken pipe).
Hat jemand eine Idee, wie ich das Programm weiterhin am laufen halte und
einen neuen Aufruf von tail starte ohne das Program zu beenden?

Mark
mark [ Di, 07 November 2006 03:03 ] [ ID #1527650 ]

Re: Programm am Leben erhalten

Mark!

> Problem ist nun, dass es ab und an zu Fehlern beim tail kommt (broken
> pipe). Hat jemand eine Idee, wie ich das Programm weiterhin am laufen
> halte und einen neuen Aufruf von tail starte ohne das Program zu
> beenden?

Den Fehler abfangen und die Pipe neu öffnen? Wenn du selbst ein SIGPIPE
kriegst, kannst du einen Handler schreiben oder das Signal ignorieren:

$SIG{PIPE} = 'IGNORE';

(Siehe perldoc perlipc.) Wenn auf deiner Seite einfach nur keine Daten
mehr kommen, pack den ganzen Kram (inkl. Öffnen) eben in eine
Endlosschleife.

Alternativ kannst du auch versuchen, tail -f selbst zu implementieren,
z.B. etwas naiv so:

#!/usr/bin/perl -w
use strict;
use IO::File;

die if $#ARGV != 0;
my $h = new IO::File $ARGV[0], "r";
if(defined $h) {
for(;;) {
while(<$h>) {
print;
}
$h->clearerr;
select undef, undef, undef, 0.25;
}
}



Gruß
Daniel
Daniel Fischer [ Di, 07 November 2006 08:26 ] [ ID #1527651 ]

Re: Programm am Leben erhalten

Danke Daniel! genau das was ich gesucht habe!
Mark

"Daniel Fischer" <spam [at] erinye.com> wrote in message
news:pan.2006.11.07.07.26.24.371856 [at] df.erinye.com...
> Mark!
>
>> Problem ist nun, dass es ab und an zu Fehlern beim tail kommt (broken
>> pipe). Hat jemand eine Idee, wie ich das Programm weiterhin am laufen
>> halte und einen neuen Aufruf von tail starte ohne das Program zu
>> beenden?
>
> Den Fehler abfangen und die Pipe neu öffnen? Wenn du selbst ein SIGPIPE
> kriegst, kannst du einen Handler schreiben oder das Signal ignorieren:
>
> $SIG{PIPE} = 'IGNORE';
>
> (Siehe perldoc perlipc.) Wenn auf deiner Seite einfach nur keine Daten
> mehr kommen, pack den ganzen Kram (inkl. Öffnen) eben in eine
> Endlosschleife.
>
> Alternativ kannst du auch versuchen, tail -f selbst zu implementieren,
> z.B. etwas naiv so:
>
> #!/usr/bin/perl -w
> use strict;
> use IO::File;
>
> die if $#ARGV != 0;
> my $h = new IO::File $ARGV[0], "r";
> if(defined $h) {
> for(;;) {
> while(<$h>) {
> print;
> }
> $h->clearerr;
> select undef, undef, undef, 0.25;
> }
> }
>
>
>
> Gruß
> Daniel
mark [ Mi, 08 November 2006 15:05 ] [ ID #1528945 ]
Perl » de.comp.lang.perl.misc » Programm am Leben erhalten

Vorheriges Thema: LWP: 408 User-agent timeout (select)
Nächstes Thema: Prozesse Pipes