Can"t ignore signal CHLD
am 02.05.2007 17:22:23 von Ferry Bolhar
Hallo,
ich habe ein Perl-Skript, dass mittels "fork" Subprozesse erzeugt, die
dann ihrerseits mittels "exec" weitere Perl-Skripts abarbeiten (genauer
gesagt, immer dasselbe Skript, aber mit verschiedenen Parametern).
Da ich an den Exit-Stati der Subprozesse im Hauptskript nicht
interessiert bin (sie protokollieren ihre Tätigkeit ohnehin in eigene
Logdateien), aber vermeiden möchte
1) dass die Subprozesse beendet werden, bevor sie mit ihrer Arbeit
fertig sind, auch wenn das Hauptskript vorher terminiert,
2) dass auf diese Art ("fork" ohne "wait" bzw. "waitpid") Zombies
entstehen,
führe ich im Hauptskript vor dem Forken (wie in perlipc beschrieben)
ein
$SIG{CHLD} = 'IGNORE';
durch. Das bringt aber nichts - die Childs geben die Meldung
Can't ignore signal CHLD, forcing to default
aus und versterben, sobald der Hauptprozess stirbt.
Was muss ich machen, um das gewünschte Verhalten (Clients
laufen auch nach Sterben des Parents weiter - als Childs von init)
zu erreichen?
PS: Perl 5.8.6 unter Linux Fedora Core 3.
Danke für eure Antworten, und schöne Grüße aus Wien,
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Can"t ignore signal CHLD
am 02.05.2007 23:12:37 von Andreas Scherbaum
Hallo,
Ferry Bolhar wrote:
>
> führe ich im Hauptskript vor dem Forken (wie in perlipc beschrieben)
> ein
>
> $SIG{CHLD} = 'IGNORE';
>
> durch. Das bringt aber nichts - die Childs geben die Meldung
>
> Can't ignore signal CHLD, forcing to default
>
> aus und versterben, sobald der Hauptprozess stirbt.
Mit deinem Ansatz fängst du in deinem Child die Signale von
weiteren Childprozessen ab, die dieses Programm dann startet.
Das ist wohl nicht ganz das, was du möchtest.
> Was muss ich machen, um das gewünschte Verhalten (Clients
> laufen auch nach Sterben des Parents weiter - als Childs von init)
> zu erreichen?
Du möchtest aber eigentlich das HUP Signal im Child ignorieren.
Dazu vielleicht noch komplett von der Console abkoppeln, das
Kochbuch hat dazu imho einige gute Hinweise.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Can"t ignore signal CHLD
am 04.05.2007 11:06:54 von Ferry Bolhar
Andreas Scherbaum:
> Du möchtest aber eigentlich das HUP Signal im Child ignorieren.
> Dazu vielleicht noch komplett von der Console abkoppeln, das
> Kochbuch hat dazu imho einige gute Hinweise.
Im Kochbuch habe ich dazu nichts gefunden, aber einen Hinweis
bekommen.
Mittels:
use POSIX 'setsid';
setsid();
im Code des Childs kopple ich ihn vom Parent ab (er wird dann
ein Child des "init"-Prozesses) und dadurch vom Parent unabhängig.
Der "init"-Prozess sorgt auch dafür, dass er nach seiner Terminierung
nicht als Zombie übrig bleibt.
Portabel ist das allerdings leider nicht; unter Linux zumindest aber
funktioniert es. Unter Tru64 funktioniert es, wenn ich gleichzeitig
$SIG{HUP} = 'IGNORE';
im Parent setze, und unter AIX funktioniert es überhaupt nicht.
Glücklicherweise verwenden wir bei uns sonst keine anderen UNIX-
Derivate, sonst hätte ich vermutlich noch entsprechend viele andere
unterschiedliche Verhaltensweisen zu berücksichtigen. Das ist eben
das schöne an UNIX, das es so einheitlich ist! ;-)
Jedenfalls danke für eure Hilfe,
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at