entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

PHP - Matar todos los procesos de www-data desde código

Estoy realizando una aplicación en php (no una web) la cual inicia múltiples procesos (a través de distintos hilo) utilizando PCNTL.

Estos nuevos proceso que abre PCNTL pertenecen a www-data (incluidos los nuevos arranques de apache2 para cada hilo) y no pueden ser cerrados si quiera por un administrador, solo puede cerrarlos root.

Código para Multi-Thearing:

    foreach($routes as $route)
    {
        $pid = pcntl_fork();
        if ($pid)
        {
            // we are the parent
            pcntl_wait($status); //Protect against Zombie children
            sleep(2);
        } else
        {
            // we are the child
            exec('sh '.$route.'udpSender.sh 1 >> /tmp/udpSender.log &');

            // SID registry
            $sids[count($sids)] = posix_setsid();
        }
    }

Los procesos creados son archivos .sh, los cuales ejecutan otros procesos "demonios", por ello redirecciono la salida 1.

He intentado matar dichos procesos de distintas formas (uno a uno por nombre, por id, tods por nombre, por usuario), pero nunca consigue matarlos a todos.

Intentos fallidos para matar los procesos:

    shell_exec('killall -9 -u www-data');
    shell_exec('skill -9 -u www-data');
    shell_exec('kill -9 nombreProceso');
    shell_exec('pkill -9 nombreProceso'); // Este ha funcionado, pero solo con los hijos que han generado los .sh

    shell_exec('echo rootPass | sudo killall -9 -u www-data');

    $fp = @popen('su --login root --command 'killall -9 -u www-data', "w");
    @fputs($fp, 'rootPass');
    @pclose($fp);

    //Estas pruebas tambien se han echo con otros comandos como matarlos por nombre o por id y no dan resultado

Ah, www-data es sudoer:
www-data ALL=(ALL:ALL) ALL

Como dichos scripts estarán ejecutándose en local (no son servidores web, pensados para el acceso a través de internet), no me importa las medidas que haya que tomar mientras que la solución funcione (tales como hacer a www-data super usuario o darle permisos poco convencionales)

P.D: Servidor Debian 7, PHP ver 5.4.20

1 Respuesta

2votos

rubengc Puntos1090

He encontrado la solución indicando en sudoers que no necesita password para ejecutar cualquier comando killall:

www-data ALL=(ALL) NOPASSWD: killall*

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta