Shellscript via PHP ausführen und Ausgabe in Echtzeit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Shellscript via PHP ausführen und Ausgabe in Echtzeit

    Hallo zusammen,

    ich möchte für eine Webapplikation einen One-Click-Installer programmieren.
    Der User soll ein Formular mit ein paar Daten (Username, Passwort, Systemname, etc.) befüllen und das Formular dann abschicken. Daraufhin wird mittels PHP ein Shell-Script generiert, welches die Befehle für die Installation der Webapplikation enthalten.

    Bis dahin funktioniert schon alles.

    Jetzt soll noch folgedes passieren:
    Das Shellscript muss natürlich noch ausgeführt werden. Die Ausgabe des Shellscripts (dort werden Befehle wie wget, mkdir, tar, etc. ausgeführt) soll z.B. in einem <div> dargestellt werden; am besten in Echtzeit...; wie auf einer Konsole.

    Wie kann ich sowas darstellen? Gib es da evtl. schon fertige Code-Schnipsel?

    Root-Zugriff auf die Maschine habe ich, sodass Änderunge an der Systemkonfiguration kein Problem sind.

    Hoffe auf ein paar Tipps... Vielen Dank!

    Grüße,

    Philipp

  • #2
    Hallo pbundschuh,

    ich hatte vor einiger Zeit eine ähnliche Umsetzung und habe es wie folgt gemacht:

    Sobald ich das Shellscript gestartet habe, hole ich mir von diesem die zugewiesene PID (ProcessID), und speichere diese zwecks späterer Verwendung in die Datenbank. Das Script selbst führt n Prozesse aus, in meinem Fall das herunterladen und konvertieren von Bildern. Jeder erfolgreich beendete Schritt wird samt einiger Daten in der Datenbank anhand der PID festgehalten. Den aktuellen Stand eines Importprozess hole ich mir nun mittels AJAX und einem PHP Script, und gebe diese Informationen auf der Webseite aus. Da bei mir ein Job meistens 5-15 Sekunden benötigt, wird mittels AJAX alle 8 Sekunden das PHP Script neu geladen, und ich bekomme somit immer den aktuellen Stand Angezeigt. Echtzeit ist das nicht, eine andere Möglichkeit wüsste ich allerdings jetzt auch nicht.

    Ein kleiner Tipp zu angestoßenen Shellscripten (falls du dies nicht schon beachtet hast): Manchmal kann es passieren, dass angestoßene Shellscripte sich aufhängen und dadurch nicht beendet werden. Dafür lasse ich alle 30 Minuten einen Job laufen, welcher die Aufgabe hat alle eingetragenen und noch nicht fertigen Prozesse anhand der PIDs aus der Datenbank gegen zu prüfen. Dabei wird anhand der PID auf dem Server und der zu konvertierenden Bildmenge -anhand dessen kann man eine durchschnittliche Mindestlaufzeit vom Shellscript berechnen- geprüft ob der Prozess noch läuft. Wenn der Prozess überfällig ist, wird er abgeschossen und in der Datenbank entsprechend markiert. Das ganze lässt sich natürlich auf dein vorhaben entsprechend anpassen.



    cheers
    Zuletzt geändert von bobafett; 30.08.2009, 02:24.

    Kommentar


    • #3
      Mit dem so genannten Long Polling sendest du erstmal das Grundgerüst der Seite, hältst die Verbindung aber offen. Der Browser zeigt die Seite schonmal an, lässt aber das Lade-Icon weiter rotieren. Wenn dann Daten aus der Prozesspipe verfügbar werden, sendest du weitere script-Elemente mit einem Funktionsaufruf drin, die dann clientseitig ausgeführt werden und das div aktualisieren.

      Long Polling funktioniert in vielen Browsern auch mit AJAX, aber leider nicht im IE: der rückt den responseText erst raus, wenn er den Chunk Footer findet.

      Ich will dir damit erstmal nur einen kurzen Überblick geben, deswegen bin ich nicht weiter ins Detail gegangen.

      Edit: ich hab noch ne recht gute und detaillierte Beschreibung gefunden. Dort wird das was ich meine als "Page Streaming" und das was im IE nicht funktioniert als "Service Streaming" bezeichnet.

      Gruß,

      Anja
      Zuletzt geändert von AmicaNoctis; 30.08.2009, 16:23.
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar

      Lädt...
      X