Posso iniziare uno script in modo che sia indipendente dal processo genitore su Linux?
Domanda
C'è un modo per iniziare uno script da un altro processo, in modo che se il processo muore / estremità, lo script continua ancora?
Sarà setuid fare questo? Se dovessi impostare il proprietario a root, e quindi avviare lo script?
Per esempio, se ho qualche codice PHP di iniziare uno script, ma httpd muore o viene ucciso, penso che ci vuole il mio script con esso. C'è un modo per aggirare questo?
In particolare, sono in Fedora 10 con Apache 2 e PHP 5.
Soluzione
qui :
function become_daemon()
{
$child = pcntl_fork();
if($child) {
exit; // kill parent
}
posix_setsid(); // become session leader
}
Inoltre, è una buona idea per chiudere STDIN, STDOUT e STDERR ma non sono sicuro come fare in PHP.
Altri suggerimenti
Prova "nohup yourscript.sh &"
È possibile utilizzare la "rinnegare" built-in in bash per staccare un lavoro dalla shell che ha generato esso. Vedere: http://www.faqs.org/docs/bashman/bashref_79.html
Si dovrebbe usare pcntl_fork di PHP () (come raccomandato da @bmdhacks).
Il processo di base è, forchetta, setsid, forchetta di nuovo, chdir a /, e chiudere tutti i descrittori di file aperti. La pratica standard impone inoltre di creare un file chiamato /var/run/$NAME
, (dove $ NOME è il nome del demone), e scrivere il PID a quel file, in modo da poter controllare l'esecuzione del processo in seguito.
Io non sono un programmatore php, ma questo è normale roba * nix. Il miglior esempio php posso Google guarda come questo ciao-mondo-daemon-con-forchetta Ma, non cambia la sua directory di lavoro a '/', né sembra chiuse descrittori di file aperti (non sono sicuro di come avrebbe funzionato in php), in modo che non è collegato al stdin, stdout, e stderr del processo originale.
ho scavato un po 'di più, e ha trovato un altro articolo che può aiutare con PHP pcntl_fork ()
E, sembra che ci sia un modulo chiamato pera System_Daemon , che gestisce questo per voi (L'ho trovato attraverso qui ).
Dal comando di shell è possibile aggiungere una e commerciale (&) alla fine della riga di comando per lanciare il comando in background, che si stacca dalla shell.
Alcune buone informazioni qui: http: //www.linuxforums. org / forum / linux-programmazione-scripting / 50096-movimento-processi-background-foreground.html