Über PHP Applikation als Daemon starten?

wallcity

New Member
Hallo wollte mal wissen wie man über PHP damit gemeint shell_exec eine Applikation als Daemon starten kann, noch ne 'Anfänger'-frage dazu, wenn man etwas über Daemon startet gibt es dann auch eine PID für den Prozess?

mfg wallcity
 
Da die erste Frage relativ ungenau/schwammig formuliert ist, kommt hier eine präzise Antwort:
Ja.

Und auf die zweite Frage (genauso präzise):
Ja.

huschi.
 
Hallo also geht um folgendes:

Habe über eine PHP-Datei den Befehl drin:
PHP:
shell_exec("nohup ...")
Dieser startet dann ganz normal einen Shoutcast Server mit der vorgegebener Konfiguration. Nur jeden Sonntag schaltet der sich halt aus. Nach einwenig am herumfragen, hatte ich folgende E-Mail erhalten:

Hallo, ich habe Ihre Anfrage erhalten. Und das mit dem „aussteigen“ der Streams kann ich bestätigen. Ich kann Ihnen auch sagen woher das kommt, und zwar war es bei unserem Server so, dass jedes Mal wenn der Apache seinen Log-Rotate gemacht hat die Streams offline waren. Also haben wir uns selbst beholfen und lassen den Shoutcast in einem Daemon laufen (unabhängig vom Apache) und schon läuft die Sache rund ;-)

Daraufhin, hatte ich schon seit Wochen probiert, diese Person nochmals zu erreichen, um diese zu fragen wie man dies macht, also den Shoutcast über PHP in einem Daemin zu starten bzw laufen zu lassen.

Nun fragen ich halt euch, ob ihr mir helfen könntet.

Vielen Dank!
 
wie man dies macht, also den Shoutcast über PHP in einem Daemin zu starten bzw laufen zu lassen.

Das Starten des Dienstes muss außerhalb des Apache erfolgen. Es ist ja gerade das Problem, dass beim (notwendigen) Restart der Apache-Prozesse nach dem Logrotate die Childs ebenfalls beendet werden.

Dieser Daemon-Controller kann dann per PHP gesteuert werden.

Eine Möglichkeit wäre, per PHP Anweisungen für den Daemon-Controller in ein Control-File zu schreiben, dass dann von diesem (z.B. per Cron-Script) zyklisch ausgewertet wird und ggf. eine Aktion ausgeführt wird.
 
Das Starten des Dienstes muss außerhalb des Apache erfolgen. Es ist ja gerade das Problem, dass beim (notwendigen) Restart der Apache-Prozesse nach dem Logrotate die Childs ebenfalls beendet werden.

Dafür ist nohup doch gerade da... Also bei mir überlebt der Prozeß auch einen Apache Restart, wenn er mit
Code:
shell_exec("nohup ... </dev/null 2>/dev/null >/dev/null &");
gestartet wird.

Ansonsten ist http://www.clapper.org/software/daemonize/ noch eine Alternative zu nohup.
 
Ein double fork ist der korrekte Weg um einen Prozess abzukoppeln [1] (Hinter dem Link wird (nicht ganz korrekt) nur einmal geforkt - das muss man sich entsprechend umdenken.).
Allerdings ist es nicht gerade die feine englische Art, einen Webserver Prozesse starten zu lassen, die länger laufen als die Bearbeitung des HTTP-Requests.
Ein einfaches Shell-Script (man kann sich bei init-Scripts inspirieren lassen), das per Cron startet und ein Control-File auswertet und dann entsprechend etwas tut, sollte eine Aktion verlangt werden, sehe ich als simplen Weg.

Man kann auch einen Daemonizer benutzen (wie den oben verlinkten oder meinen persönlichen Favoriten Daemontools) - aber das erfordert wiederum (im Fall von Daemontools) die Configuration von sudoers u.s.w. und ist IMHO nicht unwesentlich aufwendiger (wenn auch schöner).

[1] http://stackoverflow.com/questions/...ts-independent-of-its-parent-process-on-linux
 
Okay vielen dank schonmal für ein paar Antworten,

nur ich muss halt über unser Firmen'panel' unseren Kunden halt anbieten, die Sequenzen über den PHP Code halt starten und stoppen zu können.

Ich schau mir zuerst mal den Code mit dem nohup mal an, leider muss ich halt wieder auf nächsten Sonntag warten, bis halt Apache wieder nen Rotate macht.

Dafür ist nohup doch gerade da... Also bei mir überlebt der Prozeß auch einen Apache Restart, wenn er mit
Code:

PHP:
shell_exec("nohup ... </dev/null 2>/dev/null >/dev/null &");

Also das hatte ich schon drin:
PHP:
shell_exec("nohup ".$setting['dir_to_cpanel']."files/linux/sc_serv ".$setting['dir_to_cpanel'].$filename." > /dev/null & echo $!");
und würde dann halt in das hier umgeändert werden:
PHP:
shell_exec("nohup ".$setting['dir_to_cpanel']."files/linux/sc_serv ".$setting['dir_to_cpanel'].$filename." </dev/null 2>/dev/null >/dev/null &");

Ist das korrekt?
 
shell_exec("nohup ".$setting['dir_to_cpanel']."files/linux/sc_serv ".$setting['dir_to_cpanel'].$filename." > /dev/null & echo $!");
Nur damit es alle Mitlesenden auch verstehen, die entsprechende Erklärung:
Das "& echo $!" war der entscheidende Part, der den gesamten nohup-Prozess nicht vom Apache los koppeln lässt.
Ein "; echo $!" hätte es durchgehen lassen, aber immer den Exit-Code vom nohup geliefert und nicht vom sc_serv.

huschi.
 
So jetzt habt ihr mich beide ganz verwirrt =)

Also wie soll ich den jetzt den Code einbauen, dass dieser sich vom Apache 'loskoppelt' und somit dann funktionieren sollte? :rolleyes:

Vielen Dank nochmals für eure Mitarbeit.
 
Wieso? Deine neue Version ist ja in Ordnung. Ich hab lediglich die Erklärung geliefert, warum es vorher mit dem nohup nicht funktioniert hat. Eben weil Du eine Und-Verknüpfung dran gehängt hast.

huschi.
 
Hallo Huschi, also wenn ich es so machen würde,

PHP:
 shell_exec("nohup ".$setting['dir_to_cpanel']."files/linux/sc_serv ".$setting['dir_to_cpanel'].$filename." </dev/null 2>/dev/null >/dev/null &");

wäre es richtig? Ich muss halt auf nächsten Sonntag wieder warten wegen dem Rotate und es dann halt nochmal probieren.

Vielen Dank
 
Mach es doch einfach und schau Dir das Ergebnis in einem Prozess-Baum an.
Dann siehst Du selbst, ob der Prozess vom Apache abgelöst wurde oder nicht.

huschi.
 
Also habe das jetzt gemacht und am Anfang konnte ich nichts starten, jetzt habe ich es zumindest mal so drin, so geht es, aber was davor ich angegeben hatte geht nicht.


Ich bräuchte halt folgenden Befehl dass dieser als Daemon gestartet wird:
Dies ist der Befehl:
PHP:
$pid = shell_exec("nohup ".$setting['dir_to_cpanel']."files/linux/sc_trans ".$setting['dir_to_cpanel'].$filename." </dev/null 2>/dev/null >/dev/null & echo $!");
 
Back
Top