¿Puedo iniciar una secuencia de comandos por lo que es independiente de su proceso padre en Linux?
Pregunta
¿Hay una manera de iniciar una secuencia de comandos de otro proceso, por lo que si el proceso muere / extremos, el guión sigue siendo?
Se setuid hacer esto? Si tuviera que cambiar el dueño de raíz, y luego iniciar el guión?
Por ejemplo, si tengo algo de código PHP a partir de un guión, pero httpd muere o se matan, yo creo que eso me quita el guión con él. ¿Hay una manera de evitar esto?
Específicamente, estoy en Fedora 10 con Apache 2 y PHP 5.
Solución
aquí :
function become_daemon()
{
$child = pcntl_fork();
if($child) {
exit; // kill parent
}
posix_setsid(); // become session leader
}
Además, es una buena idea para cerrar stdin, stdout y stderr, pero no estoy seguro de cómo hacer que en PHP.
Otros consejos
Trate de "nohup yourscript.sh &"
Puede utilizar el "desconocer" incorporada en bash para separar un trabajo de la cáscara que lo generó. Ver: http://www.faqs.org/docs/bashman/bashref_79.html
Debe utilizar pcntl_fork de php () (según lo recomendado por @bmdhacks).
El proceso básico es, tenedor, setsid, tenedor de nuevo, chdir a /, y cerrar todos los descriptores de archivo abiertos. La práctica estándar también dicta que se crea un archivo llamado /var/run/$NAME
, (donde $ NAME es el nombre de su demonio), y escribir el PID a ese archivo, por lo que se puede controlar la ejecución del proceso más adelante.
No soy un programador php, pero esto es * nix cosas estándar. El mejor ejemplo de php que puede google tiene este aspecto hola-mundo-daemon-con-tenedor Sin embargo, él no cambia su directorio de trabajo a '/', ni que parezca que cierra los descriptores de archivos abiertos (no estoy seguro de cómo podría funcionar en PHP), por lo que no está conectado a la entrada estándar, salida estándar, y stderr del proceso original.
cavé un poco más, y encontramos otro artículo que puede ayudar con php pcntl_fork ()
Y, parece que hay un módulo de pera llamada System_Daemon , que se encarga de esto para usted (lo encontré a través aquí ).
A partir de la orden de shell que puede anexar un signo (&) en el extremo de la línea de comandos para iniciar el comando en el fondo, que lo separa de la cáscara.
Algunos buena información aquí: http: //www.linuxforums. org / foro / linux-programación-script / 50096-movimiento-procesos-fondo-foreground.html