PHP Prozessmanager erstellen

Hallo zusammen,

ich versuche gerade für ein Projekt folgendes zu realisieren. Über eine Internetseite wird auf meinem Server ein Prozess gestartet (der unter Umständen mehrere Stunden dauert)

Nun möchte ich, dass wenn ich die Internetseite schließe, dass der Prozess weiterläuft und wenn ich die Internetsetie wieder aufrufe den Prozess wieder verfolgen kann.

Wie kann ich sowas realisieren?

Muss ich den gesamten LOG der in der shell produziert wird in einem file zwischenspeichern oder macht das das system sowieso schon (CentOS)?

Ich kann den Prozess schon starten und es erfolgt danach auch eine Ausgabe, allerdings weiß ich eben nicht ob der Prozess verschwindet, wenn ich das fenster schließe und auch nicht wie ich ihn wiederfinden könnte.

Den Prozess führe ich so aus: (und geb ihn aus)

$ausgabe = popen(’/bin/’.$befehl,‚r‘);

while (! feof($ausgabe)) {
echo fgets($ausgabe, 2096).’
';
}

pclose($ausgabe);

funktioniert mit sowas mein vorhaben oder soll ich exec oder einen ganz anderen befehl nehmen?

Danke für Eure Mühe!
MrTall

Hallo,

wie bereits mehrfach gesagt: Ich habe so gut wie keine Ahnung von PHP. Aber vielleicht hilft dir trotzdem folgender Hinweis:

Der nachfolgende Parameter „&“ startet unter Bash usw. einen Prozess im Hintergrund.

mfg

tf

Hey, Danke für die Antwort,

durch das & wird nur die Konsole frei für neue Befehle, Wenn ich die Konsole aber schließe, wird der Prozess trotzdem beendet. So wurde mir das erklärt, kann das jmd bestätigen?

Gruß
MrTall

Haalo,

verstehe ich nicht ganz.

Du schriebst:

„Nun möchte ich, dass wenn ich die Internetseite schließe, dass der Prozess weiterläuft und wenn ich die Internetsetie wieder aufrufe den Prozess wieder verfolgen kann.“

Du kannst doch ein Script aufrufen, daß Deinen Prozeß startet und die „Konsole“ schließt, wenn er denn beendet sein sollte.

Die Ausgaben der Shell kannst Du ebenfalls in jede gewünschte Datei oder wohin auch immer umleiten.

Der Prozeß bekommt ja eine PID, unter der er - solange es ihn denn gibt - zu finen ist.

Wie auch immer:

Wenn du einen Background-Prozeß startest und die Shell vor dessen Beendigung verläst, wird dieser Prozeß in der Regel beendet, da er ja ein Kind der Shell ist. Die Shell sendet beim Verlassen ein hangup (hup) an die Kinderchen.

Um dies zu vermeiden, gibt es das berühmte „nohup“. Der Prozeß läuft weiter, obwohl du die Shell verlassen hast. "Kill"en kannst Du ihn immer noch, da das SIGTERM eben kein SIGHUP ist.

Bei Verwendung von „nohup“ wird die Standard-Ausgabe der Shell (die es ja dann „nicht mehr gibt“) in die Datei „nohup.out“ des entsprechenden Verzeichnisses geschrieben.

Also:

$ nohup ewiglangerprozess &

wäre die Shell-lösung.

mfg

tf

Hallo

Ein Script läuft weiter, auch wenn das Browserfenster geschlossen wird. Es beendet sich erst, wenn max_execution_time erreicht ist. Systemaufrufe wie fgets() zählen da aber nicht rein und das Script wartet auch ab, bis alle gestarteten Prozesse beendet sind. Wen man an die Befehle allerdings noch ein & anhängt, dann wird nicht abgewartet.

Man könnte auch mit mkfifo eine Pipe ins Dateisystem legen und an den Befehl ein >’ Name_der_Pipe’ anhängen, dann landen alle Ausgaben erst mal da drin. Dann kann man mit einem Weiteren Script die Daten wieder rausholen. Jetzt braucht man nur noch einen Weg, wie man das lesende Script wieder zu beenden, damit man davon nicht 2 hat wenn man ein weiteres startet.

sigterm

hmm danke für die vielen anreize!

ich probier gerade einige dieser sachen aus und werde später hier rein schreiben wie ich es nun gemacht habe :smile: