¿Cómo encontrar la fuente del proceso de desove?

12

Tengo un proceso Java ejecutándose en una instancia de RedHat Linux.

El problema es que sigue apareciendo después de que lo mato. No estoy seguro de dónde mirar. Ya fui a crontab, pero no tuve suerte.

He mirado el PPID, pero apunta a init (1).

¿Alguna idea de cómo puedo encontrar la fuente?

Jose
fuente
1
¿Puedes darnos algo para seguir? ¿El proceso escribe en algún archivo, por ejemplo? ¿Puede mostrarnos el resultado de ps xfmostrar el árbol de procesos? Tal como están las cosas, tenemos muy poco para seguir.
terdon
Dijiste que fuiste a crontab ... ¿También has verificado atsi alguno de esos es el indicado?
YoMismo
¿Puede decirnos qué software de Java está ejecutando realmente? He visto herramientas como Cassandra, que en realidad tienen un perro guardián incorporado en ciertas configuraciones que solo activa otra instancia de la base de datos una vez que la primera instancia falló (no se detuvo con gracia).
Matthias Steinbauer

Respuestas:

15

Hay varias posibilidades (algunas mencionadas en otras respuestas):

  1. Un cronjob de sistema o usuario que se ejecuta con frecuencia,
  2. En SysV init, una /etc/inittabentrada para el servicio con la respawndirectiva,
  3. En systemd, un archivo de unidad con la Restartopción establecida en un valor distinto de no,
  4. En Upstart, un archivo de configuración de servicio con la respawndirectiva,
  5. Una herramienta de monitoreo de procesos como monit, o
  6. Un proceso de vigilancia ad-hoc para ese servicio en particular.

Una nueva herramienta interesante (solo para Linux) que podría proporcionar más información sobre dónde se inicia el proceso es sysdig .

Sysdig utiliza las características de traza del kernel de Linux para proporcionar lo que equivale a un sistema rápido y amplio strace.

Por ejemplo, si quisiera ver cada proceso que se inicia ls, puedo emitir:

sudo sysdig evt.type=execve and evt.arg.exe=ls

Cuando lsse ejecute en algún lugar, recibiré un mensaje como este:

245490 16:53:54.090856066 3 ls (10053) < execve res=0 exe=ls args=--color=auto. tid=10053(ls) pid=10053(ls) ptid=9204(bash) cwd=/home/steved fdlimit=1024 pgft_maj=0 pgft_min=37 vm_size=412 vm_rss=4 vm_swap=0 env=...

Trunqué la información del entorno devuelta, pero como puede ver, en el ptid puedo ver el nombre y el pid del programa que llama a execve. execvees la llamada al sistema utilizada en Linux que se usa para ejecutar nuevos comandos (todas las demás llamadas ejecutivas son solo frontends para ejecutar).

Steven D
fuente
2
¡sysdig es un gran consejo! Por cierto, ahora está disponible para Windows (y Mac, creo) con funcionalidad limitada.
Neowizard
¿Cómo ayuda Monit aquí? Empecé a leer el manual, pero parece una alternativa o copia de seguridad de algo como Nagios. No veo cómo podría ayudarte a rastrear un proceso de reaparición.
Jefferson Hudson
7

Creo que podrías usarlo pstree. Puede especificar el comando como,

pstree -p PID

Lo anterior le dará una lista de todos los padres de las aplicaciones de Java.

Ramesh
fuente
1
Esto no ayudará en absoluto, ya que el OP ya dijo que miró el PPID, que es 1.
Guntram Blohm apoya a Monica el
@GuntramBlohm, mire la pregunta original antes de editarla. No se mencionó en la primera versión de la pregunta.
Ramesh
2
suspiro. Otro póster que convierte su pregunta en un objetivo móvil sin marcar sus ediciones :(
Guntram Blohm apoya a Monica el
5

Puede echar un vistazo a su PPID (ID de proceso principal):

$ ps -eo pid,ppid,args | grep java

Una vez que tenga el PPID (segunda columna) de su proceso Java, psvuelva a usarlo para encontrar el proceso asociado:

$ ps -p [PPID]

Editar : si el padre es 1 (init), entonces el primer padre de su proceso Java murió justo después de "dar a luz" (qué triste). Debido a eso, no puede usar la jerarquía de proceso actual para encontrarlo. Lo primero que le recomendaría que haga es verificar ps -ef. Puede encontrar al culpable solo leyendo la salida.

Luego, eche un vistazo a crontabs (ya lo hizo, pero no le hará daño):

$ for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done

Esto requerirá privilegios de root.

¿Todavía no puede ver un proceso Java programado? Dang it. Probemos algo más. Si su proceso Java está presente desde el arranque, eche un vistazo a los programas esquematizados en el momento del arranque. Sugeriría algo como ...

$ grep -iR java /etc/rc*

Si todavía no puedes encontrar nada, entonces ... Bueno, admito que me estoy quedando sin ideas. Realmente deberías echar otro vistazo ps -efy ubicar los procesos asociados con los programas basados ​​en Java. Deberías encontrarte con un demonio, o un "lanzador", responsable de la reaparición constante de tu proceso Java.

John WH Smith
fuente
Intenté buscar el proceso principal, pero solo apunta a init (PPID = 1). Modificaré la pregunta con esta información.
Jose
@JoseChavez, si su PPID es 1, entonces los procesos de Java que se están creando son procesos zombies. Mira esta respuesta aquí .
Ramesh
@JoseChavez Edité mi respuesta con algunas pistas más para investigar en su caso.
John WH Smith
2
@Ramesh Si el PPID es 1, pueden o no ser zombies . Si en realidad no fueron engendrados init, son al menos huérfanos . El stateespecificador psmostrará si son zombies (por ejemplo, ps -eo pid,ppid,state,comm); El estado será Z.
Ricitos
1
@goldilocks: si el PPID es 1, no son zombies , a menos que el proceso de inicio no funcione correctamente; debería ejecutar un ciclo de espera que cosecha a todos los zombis huérfanos de inmediato.
hmakholm dejó a Mónica el
1

Si no sabe quién es el padre, debería hacer un seguimiento del sistema como auditado

habilitaría el registro con:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

y luego en /var/log/audit/audit.logbuscar líneas como:

type=SYSCALL msg=audit(1414027338.620:6232): arch=c000003e syscall=59
success=yes exit=0 a0=7fdea0e4db23 a1=7fffec7c5220 a2=7fffec7c87d0
a3=7fdea1b559d0 items=2 ppid=17176 pid=18182 auid=1000 uid=1000 gid=1000 
euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 
ses=2 comm="sh" exe="/bin/dash" key=(null)

(dividido en varias líneas para facilitar la lectura). Usted está interesado exe="/bin/dash"y / o pid=18182qué identifica el proceso de colorete que desea buscar y ppid=17176qué identifica al padre que lo ejecutó.

Matija Nalis
fuente