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