Stefan: Perl-Skript mit "fork" funktioniert nicht als CGI

Beitrag lesen

[Backticks now considered harmful]

[...] Es soll ganz stupide ein und das selbe Programm ausgeführt werden, und der Dateiname der temporären Datei, auf die es zugreift, wird vom Skript bestimmt, und nicht vom Anwender.
Ist der Name vorhersagbar? Dann hast Du immer noch ein Problem, wenn auch ein anderes.

Ja, ich habe immer noch ein Problem damit, dass mein Programm nicht da terminiert wo ich es terminieren lassen möchte ;-).

Du spielst wahrscheinlich darauf an, dass man die Dateinamen dann erraten kann und somit ein unberechtigter Dritter eine nicht für ihn bestimmte Datei abrufen kann.
Mein Skript ist aber nur für ein Intranet gedacht (das was ich schlussendlich vorhabe, macht auf einem Server im Internet prinzipbedingt keinen Sinn), von daher halte ich es für ausreichend, den Namen aus der Prozeß-ID und dem Timestamp zusammenzusetzen - zumal der Anwender diese Datei sowieso nie unter diesem Namen zu sehen oder gar zu fassen bekommt (Das Verzeichnis liegt auch außerhalb des webserver-roots). Er bekommt später einen "gesäuberten" (d.h. alles was nicht \w, \d oder . ist, wird zum "_") Originaldateinamen zurück.

So tief wollte ich eigentlich gar nicht in die Materie einsteigen.

Würdest Du dich nach 20 Minuten am MS Flight Simulator ans Steuer einer 747 wagen, um sie von Frankfurt nach NY zu fliegen? Du wirst kaum darum herumkommen, wenigstens die essenziellen Teile der Perl-Dokumentation durchzuarbeiten. Damit kommst Du zwar auch nicht nach NY, aber zumindest darfst Du dann schonmal aufs Rollfeld gehen und vielleicht sogar aus dem Cockpit-Fenster sehen. ;-)

Witzig, dass Du genau diese Strecke ansprichst. Die bin ich tatsächlich schonmal als Passagier geflogen (allerdings in einem Airbus) - und genau deswegen habe ich mich aus Neugierde mal am MSFS in die Boeing 747 (Airbus hatte er nicht :-() gesetzt und diese Strecke eingestellt, als er mir -ulkigerweise wirklich für grob 20 Minuten- zur Verfügung stand.
In 20 Minuten schafft man es natürlich nicht "rüber", so dass ich die Landung nicht auch noch testen konnte (*Angeblich* können die Teile sogar mittlerweile eine nahezu vollautomatische Landung hinlegen, wenn der Flughafen die entsprechende Technik dazu hat, und EDDF bzw. KJFK gehören da dazu - das Feature hätte ich wirklich gern mal gesehen), aber Take-Off und in der Luft bleiben funktioniert schon nach 20 Minuten erstaunlich gut.
Der Trick: Nicht alles selbst machen versuchen, sondern auf den Autopilot zurückgreifen, der bei diesen Vögeln nämlich auch komplexere Manöver beherrscht als nur den aktuellen Kurs zu halten, wenn man ihn mit den entsprechenden Daten (z.B. gewünschte Steigrate oder gewünschte Höhe) füttert.*

Das gleiche Prinzip sehe ich auch bei Perl: Man muss nicht alles bis ins letzte Fitzelchen verstanden haben, um sein Ziel zu erreichen, sondern erreicht auch schon viel, indem man versucht, die Zusammenhänge zu verstehen, und sich quasi in Modulbauweise die Teile zusammensucht, die man braucht.

Meine Vorlage war dieses Beispiel aus selfhtml: http://de.selfhtml.org/perl/funktionen/systemaufrufe.htm#waitpid
Falls Du das Beispiel für so schlecht hältst - vielleicht könntest Du eine bessere Version davon einstellen, dann haben alle etwas davon?
Unnötig, die Perl-Dokumentation ist für diesen Fall ausreichend und auch auf Deutsch verfügbar.

Na ja, das Statement finde ich etwas gewagt. Selbst wenn Du der große Perl-Gott bist und Dir diese Doku gereicht hat, heißt das noch lange nicht, dass es jeder auf dem gleichen Weg schafft wie Du.
Etwas Starthilfe wäre für den einen oder anderen sicherlich hilfreich - und je besser die Beispiele, desto weniger "doofe" Fragen kommen im Forum auf.

[...]

Ich habe den Verdacht, Du planst ein Haus, in dem Du Stücke aus den Konstruktionsplänen von Sanssoussi, dem Eiffelturm, der Berliner Mauer, dem Telemichel und der Titanic rausreißt und mit reichlich Kleister auf dem Plan vom VW Käfer zusammenklebst. Das Ergebnis wird in aller Regel nicht zu Deinem Traumhaus führen.

Du hast die Teile identifiziert,aber Du hältst den Plan verkehrt herum (macht nix, passiert jedem Mal, auch bei IKEA-Plänen *grins*). Der Käfer fährt auf der Innenseite der Berliner Mauer herum, die ringförmig zusammengepappt den Eiffelturm umkreist. Da er die selbe Geschwindigkeit hat wie die Mauer, nur in entgegengesetzter Richtung, scheint er im Vergleich zum Eiffelturm stillzustehen. Somit kann man über die am Turm seitlich angeklebte Bugspitze der Titanic problemlos in den Käfer wechseln und auch wieder aussteigen. Sanssouci ist das Kassenhäuschen, und den Telemichel haben wir sogar noch übrig - magst ihn haben?
(Nimm's mir nicht krumm, wir haben heute >37° im Office, da kommt man auf solche Ideen. Normalerweise hätte ich nur den Käfer auf einer zum Möbiusband zusammengeklebten Berliner Mauer fahren lassen)

[SafePipeOpens-Links]
Danke, werde ich mir anschauen.

[...]

Wobei mir noch nicht so ganz in den Kopf will, warum Du den Webserver mit zusätzlicher Arbeit belasten willst, während ein ohnehin langsames Programm läuft. Wenn Du dem Benutzer Aktivität vorgaukeln willst, benutze ein animiertes GIF, das Du nach Ende der langen Arbeit ausblendest oder ersetzt. Oder verarbeite die Ausgabe des Kindprozesses direkt im CGI, noch während der Kindprozess die Ausgabe anliefert. Das dürfte in aller Regel die effizienteste Lösung sein.

Ich hatte das Programm ursprünglich ohne Fork im Einsatz.
Das Problem dabei ist, dass die Ausgabe des externen Programms schlagartig am Ende erfolgt, und nicht Stück für Stück.
In der neuen Version ist die Startzeit des Programms aber so übermäßig angewachsen, dass es zwischen Browser und Server zu einem Timeout kommt, bevor das externe Programm sein Ergebnis zurückliefern kann.
(Wobei das Problem früher schon auftreten konnte, wenn eine besonders große Datei übergeben wurde, aber da das selten bis gar nicht vorkam, war es da nicht störend.)
Deswegen wollte ich die Verbindung am Leben erhalten, indem ich ihm vom einen Prozeßteil aus so lange die "Bitte Warten"-Nachricht schicke, bis er im anderen Prozeßteil zu einem Ergebnis gekommen ist.

Gruß Stefan

*Bitte keine Belehrung, dass es ziemlich sinnfrei ist, einen Simulator anzuschmeißen, nur um sich dann vom Autopilot durch die Gegend schaukeln zu lassen, anstatt selber den Stick in die Hand zu nehmen. Es war damals einfach nur "just for fun". ;-)
Und um Deine ursprüngliche Frage zu beantworten, auch wenn sie eher rhetorisch gemeint war: Ich würde mich natürlich sicher nicht an die Kontrollen einer echten Maschine setzen, solange keine Notwendigkeit besteht. Aber schon nach dem bisschen Sim-Erfahrung würde ich, wenn ich in so einem Vogel in der Luft bin und ein Notfall eintritt, eher versuchen, mir via Funk Unterstützung vom nächsten Airport zu holen und einen Landeversuch hinlegen, als mich sinnlos zu besaufen und auf den sicheren Tod zu warten. ;-)