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?
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?
„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.
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.