Tengo un script para matar a un árbol de procesos que funciona bien en linux, pero estoy experimentando algún comportamiento extraño en osx. Realmente funciona muy bien con mi unidad de pruebas y también cuando se trata de ejecutarlo manualmente en osx, pero por alguna razón cuando se ejecuta como una jenkins trabajo actúa de manera diferente.
Así que esta es la actual función bash con un poco de depuración de eco y duerme:
killtree() {
local _pid=$1
local _sig=${2:--TERM}
echo "Stopping ${_pid}"
sleep 1
kill -stop ${_pid} # stop parent to avoid creation of new children
children=`pgrep -P ${_pid}`
echo "Children=$children"
sleep 1
for _child in $children; do
killtree ${_child} ${_sig}
done
echo "Killing child ${_pid}"
sleep 1
kill -${_sig} ${_pid}
}
La llamada a pgrep que a partir de un error de ejecución puede ser pgrep -P 9651
imprime todos los procesos en la máquina, y las secuencias de comandos se bloquea cuando intenta matar pid 0.
Pero ¿por qué iba a conseguir todos los procesos ? Cuando la ejecución se realiza el proceso de 9651 todavía se está ejecutando y si emitir el comando en la línea de comandos pgrep -P 9651
no hay salida (lo que es de esperarse ya que este proceso no debe de tener hijos).
He añadido una depuración de llamada para imprimir el árbol de procesos de la derecha antes de que el listado de los niños:
+ pstree='-+= 00001 root /sbin/launchd
\-+= 09774 root /usr/sbin/sshd -i
\-+- 09777 jenkins /usr/sbin/sshd -i
\-+= 09783 jenkins bash -c cd '\''/var/jenkins'\'' && java -jar slave.jar
\-+- 09784 jenkins /usr/bin/java -jar slave.jar
\-+- 09807 jenkins /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/bin/java -classpath/
\-+- 09817 jenkins /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/bin/java -
\--- 09828 jenkins sleep 10'
Parece normal para mí, el sleep 10
no tienen hijos.
Las ideas - estoy un poco atascado después de haber intentado depurar este por algunas horas ?
El proceso que está tratando de ser asesinado es en este caso una simple sleep 10
que es utilizada para la prueba.