Programm am Leben erhalten
am 07.11.2006 03:03:11 von mark
Hallo,
in meinem Perl-Skript habe ich folgendes Konstrukt um eine Datei auszulesen:
open IN, "exec tail -f /home/kave/abar/data |";
while () {
... 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
Re: Programm am Leben erhalten
am 07.11.2006 08:26:24 von Daniel Fischer
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
Re: Programm am Leben erhalten
am 08.11.2006 15:05:25 von mark
Danke Daniel! genau das was ich gesucht habe!
Mark
"Daniel Fischer" wrote in message
news:pan.2006.11.07.07.26.24.371856@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