/ / Cómo bifurcar un proceso desde mod_perl2 que mata a su padre - perl, centos, fork, apache2.2, mod-perl2

Cómo bifurcar un proceso de mod_perl2 que mata a su padre: perl, centos, fork, apache2.2, mod-perl2

He leído numerosos hilos sobre este tema y he intentado casi todo lo que he encontrado: > /dev/null, qx, system, exec, fork, cmd con | (cualestrabajé bajo win32, pero ahora estoy portando a CentOS que usa el MPF prefork), echo | at now y Proc :: Daemon, pero no he probado Apache2 :: Subprocess porque parece que es exactamente lo que don "t want, un hilo que está vinculado al padre.

Quizás mi situación es diferente. Al final de un proceso de restauración de base de datos de larga duración, Quiero reiniciar el muy httpd servicio desde el que se ejecuta el script. Dejando a un lado las preguntas sobre la sabiduría de tal diseño, ¿cómo puedo hacer esto? Cada método que he probado detiene el script tan pronto como ejecuta el sudo service httpd stop medio de sudo service httpd restart así que nunca comienza de nuevo por sí mismo.

La única excepción a esto es echo | en este momento, queparecía prometedor, pero si copio algo que funciona cuando lo hago en la línea de comando y lo ejecuto en el script mod_perl, obtengo una buena línea de sonido exitosa como job 1 at 2013-10-31 19:20 Pero entonces no pasa nada. No hay correo shell con now -m, no hay mensajes de error con 2>&1 y / o > /path/with/all/777/perms, ningún correo electrónico de mi propio módulo que normalmente lo hace en cualquier die, ningún archivo de registro del mismo que registra automáticamente todo. Solo un fracaso silencioso a pesar de la línea de éxito.

En caso de que ayude, esto es lo que service httpd stop carreras:

stop() {
echo -n $"Stopping $prog: "
kill -TERM `cat ${pidfile}`
RETVAL=$?
if [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
then success
else failure
fi
echo
}

Esto parecía realmente simple antes y hay tantas soluciones sugeridas, pero ninguna de ellas parece hacerlo. ¿Qué más hay para verificar o probar?

Respuestas

0 para la respuesta № 1

Lo que finalmente funcionó fue robar una pista de los documentos de Apache2 :: SubProcess.

En el script mod_perl, acabo de hacer qx($command 2>&1) aunque otros métodos también podrían funcionar.

Luego, en el script que se llama en $ command, simplemente pongo estas líneas antes del reinicio httpd:

use POSIX "setsid";
setsid or die "Can"t start a new session: $!";

Nunca vuelve al script mod_perl, lo cual está bien, ya que de todos modos redirijo a una página de visualización de registro.

Mientras tanto, el script que contiene el reinicio produce el registro correctamente a través de la misma redirección STDOUT que tenía allí antes y me envía un correo electrónico si algo dies.

Además, el script que contiene el reinicio funciona normalmente desde la línea de comandos, como también fue diseñado para hacerlo.