2009-05-13 1 views
4

Gibt es eine Möglichkeit, ein Skript von einem anderen Prozess zu starten, so dass das Skript weiterhin ausgeführt wird, wenn der Prozess endet/endet?Kann ich ein Skript starten, damit es unabhängig von seinem übergeordneten Prozess unter Linux ist?

Wird setuid dies tun? Wenn ich den Besitzer auf root setzen und dann das Skript starten würde?

Zum Beispiel, wenn ich etwas PHP-Code ein Skript starten, aber httpd stirbt oder wird getötet, denke ich, dass es mein Skript damit dauert. Gibt es einen Weg dahin?

Insbesondere, ich bin auf Fedora 10 mit Apache 2 und PHP 5.

Antwort

5

Von here:

function become_daemon() 
{ 
    $child = pcntl_fork(); 
    if($child) { 
     exit; // kill parent 
    } 
    posix_setsid(); // become session leader 
} 

Darüber hinaus ist es eine gute Idee, STDIN, STDOUT und STDERR aber ich schließen Ich bin nicht sicher, wie man das in PHP macht.

+0

fork() ist der richtige Weg, dies zu tun, aber Sie sollten technisch Gabel ein zweites Mal, so dass der Prozess ist nicht Gruppen-Führer und kann nicht reacquire ein kontrollierendes Terminal – JimB

+0

Ich denke, ich kann einfach STDIN, STDOUT und STDERR in den Aufruf meines Skripts schließen. Oder vielmehr, woanders umleiten. –

+0

Also im Wesentlichen bricht Forking den Prozess in einen anderen Prozess richtig? Wenn jedoch die Ausführungszeit eines Prozesses, der mit PHP gestartet wurde, begrenzt ist, würden diese Einschränkungen trotzdem gelten? Mein Skript scheint nach einer Woche zu sterben, läuft aber gut über die Befehlszeile. –

-5

Von der Befehlsshell aus können Sie am Ende Ihrer Befehlszeile ein kaufmännisches Und (&) anhängen, um den Befehl im Hintergrund zu starten, der ihn von der Shell trennt.

Einige gute Infos hier: http://www.linuxforums.org/forum/linux-programming-scripting/50096-moving-processes-background-foreground.html

+1

Ich führe es bereits in der Hintergrund mit einem kaufmännischen Und-Zeichen (&). Aber es scheint es nicht wirklich vom übergeordneten Prozess zu trennen, nur aus dem Vordergrund. –

+1

-1 Hintergrund ein Prozess hat nichts damit zu tun, es von seinem Elternteil zu trennen – JimB

0

Sie sollten php's pcntl_fork() verwenden (wie von @ bmdhacks empfohlen).

Der grundlegende Prozess ist, Gabel, Seid, Gabel wieder, Chdir zu /, und schließen Sie alle Ihre geöffneten Dateideskriptoren. Die Standardübung schreibt außerdem vor, dass Sie eine Datei namens /var/run/$NAME erstellen (wobei $ NAME der Name Ihres Daemons ist) und schreiben Sie die PID in diese Datei, damit Sie später die Prozessausführung steuern können.

Ich bin kein PHP-Programmierer, aber das ist Standard * nix Sachen. Das beste PHP-Beispiel, das ich googlen kann, sieht so aus hello-world-daemon-with-fork Aber er ändert sein Arbeitsverzeichnis nicht zu '/', noch sieht es aus, als ob er offene Dateideskriptoren geschlossen hat (ich bin mir nicht sicher, wie das in PHP funktionieren würde)), so dass er nicht mit der stdin, stdout und stderr des ursprünglichen Prozesses verbunden ist.

grub ich ein wenig mehr, und einen weiteren Artikel gefunden, die mit PHP pcntl_fork()

helfen kann

Und es sieht aus wie eine Birne Modul System_Daemon, genannt es gibt, die dies für Sie behandelt (ich es durch here gefunden).

4

Try „nohup yourscript.sh &“

+0

[revidierter Kommentar] Sie sollten sicherstellen, dass Sie alle Ihre Streams explizit entsprechend umleiten. Während diese Methode funktioniert, gibt es bessere, kontrollierbarere Möglichkeiten, dies zu tun. – JimB

+0

Diese Methoden gehen jedoch davon aus, dass Sie die Kontrolle über den untergeordneten Prozess haben und diese ändern möchten. Poster hat nicht angegeben. Wenn Sie wget abstoßen, um ein ISO-Image oder etwas anderes zu erhalten, ist Nohup eine viel bessere Methode als das Neukompilieren von wget zum Daemonisieren. Aber ja, das Umleiten deiner Streams ist besser, sonst landest du mit nohup.out Dateien herum. – Aaron

+0

Nein, ich empfehle nicht, wget zu patchen :) Ich denke, es ist nicht klar, dass der OP einen echten Daemon-Prozess erstellen wollte. Ich habe das aus einem seiner Kommentare erfahren, wo er sagte, dass es php läuft und nach einer Woche stirbt – JimB

Verwandte Themen