2011-12-05 31 views
8

Para un sitio web, necesito poder iniciar y detener un proceso de daemon. Lo que estoy haciendo actualmente esIniciar un daemon desde PHP

exec("sudo /etc/init.d/daemonToStart start"); 

El proceso de daemon se inicia, pero Apache/PHP se cuelga. Haciendo un ps aux reveló que sudo sí mismo cambió en un proceso zombie, matando con eficacia todo el progreso posterior. ¿Es este comportamiento normal cuando intento iniciar un daeomon desde PHP?

Y sí, Apache tiene el derecho de ejecutar el comando /etc/init.d/daemonToStart. Modifiqué el archivo/etc/sudoers para permitir que lo haga. No, no he permitido que Apache pueda ejecutar ningún tipo de comando, solo unos pocos para permitir que el sitio web funcione.

De todos modos, volviendo a mi pregunta, ¿hay una manera de permitir PHP para iniciar los demonios de una manera que no se crea un proceso zombie? Pregunto esto porque cuando hago lo contrario, detener un daemon ya iniciado, funciona bien.

+0

¿No debería haber un argumento 'start'? – ZeissS

+0

Cierto, olvidé agregar eso a la pregunta. En mi código, lo tengo. Pero, voy a editar la pregunta para completarla. – ThaMe90

Respuesta

10

Pruebe a agregar > /dev/null 2>&1 & al comando.

Así que esto:

exec("sudo /etc/init.d/daemonToStart > /dev/null 2>&1 &"); 

Sólo en caso de que quiera saber lo que hace/qué:

  • > /dev/null - redirigir la salida estándar a/dev/null (Blackhole que, en otras palabras)
  • 2>&1 - redirigir STDERR a STDOUT (blackhole que también)
  • & proceso de separación y se ejecutan en segundo plano
+0

¡Gracias, eso funcionó! – ThaMe90

+0

Gracias por la explicación adicional, pero debido a que la salida está oscurecida, cualquier código que debería haberse ejecutado después de que el daemon haya comenzado, también se autoriza. Tengo que verificar si el proceso ha comenzado, pero ese código nunca se dispara ... – ThaMe90

+1

Cuando comienza un proceso con este método, debe generar el PID del proceso que se creó. Puede tomar esto y luego (por ejemplo) ejecutar 'ps | grep $ pidOfProcessYouJustStarted' para asegurarse de que se está ejecutando. – DaveRandom

0

que nunca han intentado iniciar un daemon de PHP, pero tienen tratado de ejecutar otros comandos de shell, con muchos problemas. Aquí hay algunas cosas que he intentado, en el pasado:

  • De acuerdo con la respuesta de DaveRandom, anexar /dev/null 2>&1 & al final de su comando. Esto redirigirá los errores a la salida estándar. Luego puede usar esta salida para depurar.
  • Asegúrese de que la RUTA del usuario de su servidor web contenga todos los binarios referenciados dentro de su script daemon. Puede hacerlo llamando al exec('echo $PATH; whoami;). Esto le dirá que el usuario PHP se está ejecutando bajo y su variable PATH actual.
2

que tenían el mismo problema.

Estoy de acuerdo con DaveRandom, debe suprimir todos los resultados (stdout y stderr). Pero no hay necesidad de poner en marcha en otro proceso con la terminación '&': la función exec() no puede comprobar el código de retorno más, y vuelve bien, incluso si hay un error ...

y prefiero guardar salidas en un archivo temporal, en lugar de 'blackhole'it. solución de trabajo:

$temp = tempnam(sys_get_temp_dir(), 'php'); 
exec('sudo /etc/init.d/daemonToStart >'.$temp.' 2>&1'); 

acaba de leer el contenido del archivo después y eliminar archivos temporales:

$output = explode("\n", file_get_contents($temp)); 
@unlink($temp);