1 votos

extraño comportamiento de pgrep en un script de bash

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.

3voto

KenB Puntos 236

Donde están recibiendo su versión de pgrep?

La versión que tengo de la MacPorts es codificada de tal forma que si no se proporciona un patrón coincidirá con todos los procesos, incluso si usted tiene calificativos tales como el -P opción.

Cuando I número pgrep -P<ppid> puedo obtener una lista completa de los procesos. Si agregar un patrón como en pgrep -P<ppid> \. , a continuación, que funciona como se espera sólo la prestación de procesos con el ppid.

En cuanto a la diferencia de comportamiento, tal vez usted tiene un par de versiones de pgrep en su máquina y el jenkins trabajos tienen un diferente CAMINO, por lo que son encontrar una versión diferente?

Desde la ventana de terminal, usted puede buscar varias versiones con:

mdfind -name pgrep

También le sugiero que comparar la variable de RUTA de acceso utilizado en el trabajo vs interactivo.

Para ver el archivo que el shell va a utilizar, usted puede usar type -p pgrep y type -a pgrep le mostrará todos los lugares de la RUTA de acceso donde pgrep se puede encontrar.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X