Martin St: fork, reaper, Zombie-Prozesse und setsid

Beitrag lesen

Hallo Philipp,
ich glaube wir sprechen ein wenig aneinander vorbei (was aber nicht tragisch ist).

Ich dachte, Du sagtest: wenn der Apache das Script killt, sobald kein STDOUT mehr existiert (was man tatsächlich auch abstellen kann - nur mein Provider scheinbar nicht), dann laß doch ein Sohn (der ein Dämon, weil autark vom Vater, ist) die Meldung machen (er terminiert sich ja eh selbst) (geht aber nicht, weil der Dämon-Sohn nicht an den Browser des Client kommt). Ich könnte auch den Vater die Meldung an den Browser ausgeben lassen, einen Dämon-Sohn zeugen lassen (klingt schon ordinär...), der den REst abarbeitet und der Vater läßt sich durch den Apachen killen (weil er STDOUT zumacht), nachdem er die Statusmeldung abgegeben hat. Geht aber auch nicht, weil der Dämon-Sohn trotzdem Ergebnisse an den Browser abgeben muß, und dort nicht hinkommt). Der Vater kann diese Meldungen aber via Pipe auch nicht mehr annehmen (wäre die einzige Verbindungsmöglichkeit), weil er nicht mehr exisiert. Wenn der Dämon-Sohn sich jetzt irgendwie festfrißt kann es sein, daß er sich selbst nicht mehr killen kann, und eine übergeordenete Instanz gibt es auch nicht mehr (Vater ist ja schon weg), außer den Administrator meines Providers. Er wäre ein Zombie. Also kann es kein Dämon sein.

Bleibt nur ein normaler Parallelprozess bei dem der VAter als Kontrollinstanz vom Sohn bestehen bleibt und informiert wird, wenn der Sohn terminiert (also kein Dämon), der sohn wird aber ebenfalls gekillt, wenn der VAter vom Apachen umgelegt wird (wenn er versucht den STDOUT zu schliessen). SOmit kann nur der Sohnprozess (kein Dämon) die Statusmeldung ausgeben und sich dann vom Apachen killen lassen (weil er STDOUT zumacht). Geht aber auch nicht, weil der Sohnprozess zwar ein STDOUT besitzt, dieser aber nicht zu Client weist, sondern zum VAter.

Nun, warum schreibst du dir keinen Reaper oder setzt einfach $SIG{CHLD} auf "IGNORE"?
Bei SIGCHLD auf IGNORE, wird dem System mitgeteilt, dass Childstati gar nicht
interessieren und der Prozess sogleich aus der Prozesstable entfernt werden kann.

Ich habe aber keinen Zugriff auf die ps. Der REst der Antwort: siehe oben.

Mein Problem ist, daß der Provider die Server-Pufferung nicht abschaltet (kann oder will). Hier liegt scheinbar die Lösungsmöglichkeit (weil eine ungepufferte Ausgabe, wie ich sie will, bei anderen Providern lauft). Im Moment verfolge ich deshalb zwei Möglichkeiten: einen eigenen kleinen http-server zu schreiben (der die Ausgabe ungepuffert über einen eigenen Port leitet), oder die Übertragunsgpakete mit unnützen Daten zu füllen (damit der Puffer geleert werden muß).

Was letzendlich laufen wird, weiß ich noch nicht. Vielleicht lasse ich auch nur via Javascript ein kleines Fenster aufpoppen "Bitte warten" und das dann erst die Perlroutine startet...)

Gruß!
MArtin