Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Perl-Script startet externe Anwendung - Prozess stoppt nicht

0 views
Skip to first unread message
Message has been deleted

Frank Seitz

unread,
Oct 8, 2009, 9:06:44 AM10/8/09
to
Dominik Pusch wrote:
>
> ich habe ein kleines Perl script geschrieben, dass eine externe
> Anwendung startet, welches wiederrum je nach ᅵbergabeparameter
> allerlei Dinge nach stdout zeilenweise Ausgeben kann (z.B. die Zahl Pi
> berechnet) und in vielen Fᅵllen niemals oder nach sehr langer Zeit
> endet:
>
> open(PROGRAMM, "/usr/bin/programm -a $uebergabeparameter |") ||
> die "Problem mit Programm aufgetreten: $!";
>
> while (<PROGRAMM>)
>
> {
> print "$_<BR>";
> }
> close (PROGRAMM) || die "Kann Programm nicht beenden: $!";
>
>
> Im Browser werden die Ausgaben zeilenweise angezeigt. Soweit so gut.
> Nur wenn ich den Browser schlieᅵe, bzw. den Stop-Button des Browsers
> klicke, so lᅵuft der PROGRAMM-Prozess im Hintergrund weiter.
> Kann man das Perl-Script irgendwie so anpassen, dass bei Abbruch der
> http-Verbindung auch der externe Prozess gekillt wird?

Der PROGRAMM-Prozess lᅵuft so lange weiter bis er fertig ist
oder er nichts mehr auf die Pipe schreiben kann, weil sein Parent weg ist,
oder sein Parent ihn killt.

Der Parent muss das also steuern, indem er prᅵft, ob die
Browserverbindung noch da ist.

Grᅵᅵe
Frank
--
Dipl.-Inform. Frank Seitz
Anwendungen fᅵr Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2

Message has been deleted

Frank Seitz

unread,
Oct 8, 2009, 11:56:03 AM10/8/09
to
Dominik Pusch wrote:

> Frank Seitz wrote:
>>
>> Der PROGRAMM-Prozess lᅵuft so lange weiter bis er fertig ist
>> oder er nichts mehr auf die Pipe schreiben kann, weil sein Parent
>> weg ist, oder sein Parent ihn killt.
>>
>> Der Parent muss das also steuern, indem er prᅵft, ob die
>> Browserverbindung noch da ist.
>
> Also ich habe die Prozesse mal verfolgt:
> `-apache2---script.pl---programm
>
> Wenn ich jetzt den Browser stoppe, dann erbt init den Prozess
> programm. apache2 scheint also script.pl zu killen, was die Child-
> Prozesse von script.pl verwaisen lᅵsst.

Da stimmt was nicht. Meines wissens killt apache seine childs nicht.

> Laut meine Infos, sollte aber jedem verwaisten Prozess immer (von
> init?) ein SIGHUP gesendet werden?

Das stimmt definitiv nicht. Der parent wird unterrichtet (SIGCHLD), wenn
sein child stirbt, aber nicht umgekehrt. Das mit dem SIGHUP macht
eine Login-Shell, aber kein normaler Prozess.

> Aber auch das passiert nicht!

Was daher richtig ist.

> Wenn ich meinem verwaisten Programm manuell ein SIGHUP sende, terminiert es
> nᅵmlich auch!

Ja, was sonst.

> Aber zurᅵck zu Deiner Ausage: Der parent von meinem script.pl ist ja
> apache. Dieser terminiert script.pl ja auch ordnungsgemᅵᅵ, wenn die
> Browserverbindung abreiᅵt. Nur script.pl terminiert dabei nicht
> programm!
> Aber zurᅵck zur Ausgangsfrage: Kann man ein cgi-Perlscript irgendwo so
> gestalten (eine zusᅵtzlich Anweisung oder ᅵhnliches?), dass wenn es
> ein entsprechende KILL-Signal von apache bekommt, auch ein kill-Signal
> an seine Kinder weiterleitet, bevor es sich entgᅵltig terminiert?

Wenn dem so ist, dass apache seinem CGI-child ein Signal schickt
(was ich nicht glaube), kᅵnntest du dies mit einem
Signalhandler erreichen.

Grᅵᅵe
Frank Seitz

Message has been deleted
Message has been deleted

Frank Seitz

unread,
Oct 8, 2009, 4:24:57 PM10/8/09
to
Dominik Pusch wrote:
> Frank Seitz wrote:
>>
>> Da stimmt was nicht. Meines wissens killt apache seine childs nicht.
>
> Ok, dann killt sich wohl script.pl selbst? Was passiert den mit den
> Ausgaben (print-Anweisungen) eines (weiter laufenden) cgi-Scriptes,
> wenn die Browserverbindung unterbrochen wurde? Verliert das Script
> vielleicht ein Pipe zu Apache und beendet sich deshalb oder wie wird
> das gesteuert?

Der Kernel schickt dem Prozess ein SIGPIPE, wenn dieser auf
eine geschlossene Pipe oder einen geschlossenen Socket schreibt.
Daraufhin terminiert der Prozess (sofern er das Signal nicht
besonders behandelt).

Grᅵᅵe
Frank

0 new messages