Programm beenden wenn n Sekunden keine STDIN
am 17.11.2006 00:32:40 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
Dominik Pusch wrote:
> ich möchte mit perl ein externes Programm starten und wenn das
> Programm beispielsweise 10sekunden lang keine Ausgaben mehr gibt,
> soll es beendet (gekillt) werden.
>
> So sieht es momentan aus:
>
> $| = 1;
> open(PROGRAMM, "/usr/bin/program |") || die "Problem: $!";
> while (
> {
> print "$_";
> }
> close (PROGRAMM) || die "Fehler: $!";
>
>
> Wie könnte man so etwas realisieren? Ich brauche irgendwie so etwas
> wie ein 'Timer'. Oder kriegt man so etwas irgendwie geschickt mit
> sleep(10); hin?
$ perldoc -f alarm
Da findest Du auch ein Beispiel.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Post removed (X-No-Archive: yes)
Dominik Pusch wrote:
> Jemand eine Idee, wieso die Shell danach so durcheinander ist?
Das liegt nicht an dem Perlprogramm, sondern an dem Programm
das zu startest. Das schaltet das Terminal offenbar in den
Raw-Mode und beim Empfang des SIGPIPE nicht wieder zurück
in den cooked mode. Ist das Programm überhaupt geeignet, über
eine Pipe zu kommunizieren?
Manuall kannst Du das Terminal mit
$ stty sane
zurückschalten.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Post removed (X-No-Archive: yes)
Dominik Pusch wrote:
> Frank Seitz wrote:
>>
>>Das liegt nicht an dem Perlprogramm, sondern an dem Programm
>>das zu startest. Das schaltet das Terminal offenbar in den
>>Raw-Mode und beim Empfang des SIGPIPE nicht wieder zurück
>>in den cooked mode. Ist das Programm überhaupt geeignet, über
>>eine Pipe zu kommunizieren?
>>
>>Manuall kannst Du das Terminal mit
>>
>> $ stty sane
>>
>>zurückschalten.
>
> Danke! Du hast Recht, ich habe es nun manuell per 'kill' probiert und
> es verhält sich genauso :(
>
> Hm, das macht das ganze noch komplizierter und ich bin wieder beim
> Ausgangsproblem: Gibt es eine Möglichkeit, wenn ich für N Sekunden
> keine Ausgaben vom Programm bekomme, einen bestimmten Keystroke
> (z.B. Ctrl-C) an das Programm zu senden?
> So ganz habe ich die alarm() Funktion noch nicht verstanden:
> local $SIG{ALRM} = sub { die "Timeout" };
>
> Ist es nur das "sub {die;}", welches das Programm killt? Kann man
> irgendwie vor dem "die" noch einen Keystroke senden so ähnlich wie:
> local $SIG{ALRM} = sub { print PROGRAM "^C"; die "Timeout"; };
>
> Funktioniert so leider nicht. Das Programm bekommt wohl kein Ctrl-C
> und scheinbar auch keine andere Zeichenketten mit print HANDLE.
Ja, es ist das die() aus dem Alarm-Handler, was das bewirkt.
Der Unix-Kernel schickt dem Schreiber ein SIGPIPE,
wenn der Leser der Pipe vorzeitig stirbt.
Wenn der Schreiber sich interaktiv bei einem ^C besser
verhält, kannst Du ihm aus dem Alarm-Handler auch
ein SIGINT schicken. Dein Gedanke ist schon richtig,
dies mittels print() erreichen zu wollen, ist allerdings
völlig falsch. Nimm stattdessen die Funktion kill().
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel