Procesar para resolver la historia del caso desaparecen sin razón

contorno

Hace algún tiempo, la empresa tiene un proceso sistemático siempre dejar de fumar sin razón, buena parte del cliente, siempre aparece en el servidor principal, sino que también carece del tiempo de ocurrencia de la ley, por supuesto, con el tiempo descubrió que era un cliente habitual, pero más la ley especial. Después miramos detrás del contenido va a entender, muy especial!

proceso de análisis preliminar Crash?

Cuando mis colegas me encuentran, mi primera reacción fue que el proceso no es el accidente, y si un accidente, que suelen tener un registro de bloqueo, comprueba de nuevo, lo que los registros no se quedan atrás, por supuesto, a veces el Choque, JVM de hecho no va a dejar registros de errores, pero esto es particularmente rara, y la gran mayoría del operador humano.

El muertes del sistema operativo?

Dado que no es accidente, no es un sistema de pérdida de memoria es OS de muertes, pero pronto también descartó a través dmesg, porque aún no hay signos de la matanza.

System.exit?

Después de más de dos factores excluidos, entonces inmediatamente me pregunto si hay algún código que se ejecuta System.exit, a continuación, volver a compilar un JDK, imprimir algún método de registro de salida del sistema, a continuación, a la espera de un milagro.

Emocionante es que el proceso realmente se ha ido, pero, lamentablemente, nos enterrado no se produjo un punto de registro. Me hace profunda en el pensamiento de nuevo.

return Fuente

Desde el aspecto de registro realmente llamar ShutdownHook

image.png

Así que encontrar la ubicación de origen addShutdownHook

image.png

Una vez más se volvió un código fuente del JDK poco, además de la salida normal, System.exit como lo serían otras circunstancias llamar a esto un gancho de cierre, por lo que va a enterrar a punto enterrado en el método Shutdown.runHooks.

image.png

Seguimos esperar que las cosas sucedan de nuevo, y por supuesto, no mucho por la tarde se llevó a cabo, imprimir el siguiente registro

image.png

Esa fue que se recibe una señal SIGHUP, la señal finalmente se retirará del proceso, JVM esta señal es realmente ningún tratamiento especial, por lo que vemos no hay registros de errores.

El siguiente paso es encontrar qué recibió esta señal, esta señal es Quien ha hecho.

Identificar la fuente

Esta señal SIGHUP, el principal acontecimiento escenario es un terminal de sesión de la Consola se cierra cuando una señal SIGHUP se envía a la sesión asociada con el proceso, esta señal por defecto para salir del proceso. Por esta razón he descargado específicamente ITerm2 (mis colegas y yo estamos Mac, con el terminal de iTerm2) el código fuente para encontrar una señal SIGHUP muy pocas enviar

image.png

Se podrá ver el nombre PTYTask adivinado, esto debe ser una tarea seesion, a continuación, introduzca el código para ver que hay dos métodos principales son la señal SIGHUP se envía al niño, son dealloc y parada, que se detendrá por la función sendSignal a hijo proceso envía una señal SIGHUP.

image.png
Por esta prefiero personas masoquistas general que la forma de determinar este es el código que estoy buscando, antes del código de objeto-C no está escrito, preguntando si hay una herramienta similar para java-jmap me deja ver memoria en el caso del objeto, pero no pudo encontrar un temporal, pero tropezó Mac incluye herramientas Actividad será capaz de ver algunas señales, entonces me encontré iTerm2 proceso de Actividad, y después se tomaron muestras de datos en su memoria, a ver si se puede coger PTYTask similares. dealloc o una llamada parada pila, pero más difíciles de simular debido al tiempo que existe diferencia, haga clic en el tiempo de muestreo, terminó pronto, no he tenido tiempo de cerrar la sesión. intervalo cuando se mira en la posibilidad informes de ejemplo para ver el comando / usr / bin / muestra, la actividad original es el uso de este comando es muestreada, a continuación, explorar un puñado, realmente hacerlos participar, el tiempo de muestreo puede ser personalizado es tiempo de 1 ms, esto me da mucho tiempo para operar, por lo que después del muestreo se enciende, continúe para abrir una sesión, a partir de un proceso, a continuación, cierre, repetidas varias veces, para ver la muestra de salida después del final de la toma de muestras, lo que realmente captó llamar pila de PTYTask.stop
image.png

Asimismo, verificó el proceso hijo cierre de la sesión, cuando de hecho voy a enviar una señal correspondiente SIGHUP.

Hasta el momento podemos confirmar que se trata de

  • La salida del proceso debido a que la señal recibida SIGHUP
  • El SIGHUP se debe a sesión de Terminal Cerrar no es el caso de que al final?

Repetir la escena reedición

Esto aparentemente menos probable, ya que cuando se ejecuta el script de Java y traerá, por lo que el proceso se ejecutará en segundo plano, no se produce esta sesión del problema. Leer la siguiente secuencia de comandos, y de hecho se puso, y se simula varias veces, llame al comando java con y en una cáscara, proceso de java no se cierra la salida de la terminal. ¿Se debe a la configuración del terminal y mis colegas no son los mismos? Más tarde, a mis colegas lo hice iTerm2 en la configuración de seesion a la siguiente miré, y me siento exactamente lo mismo, lo cual es muy extraño.

A continuación, volver y volver varias veces antes de desaparecer cuando el proceso de registro (Quiero que mis colegas tienen reservas), ver el momento en el que varias salidas de proceso, respectivamente

  • 01/14/2019 20: 42: 52 * 15/01/2019 18: 34: 00 * 01/18/2019 00: 57: 58 * 01/18/2019 17:34:30

Esta vez no hay una ley varias miradas, pero de repente me recordó 18/01/2019 día es el viernes, un colega en un viaje de negocios en Shanghai, pero que sería 17:34:30 debe trabajar rápido, o de lo contrario sólo de Shanghai volver cochero a Hangzhou, por lo que pidió a un colega en ese punto no está listo para volver a Hangzhou, y sus colegas dicen que realmente encajar en el equipo para preparar la parte posterior cochero a Hangzhou, por lo que pidió entonces varias otras veces no es casi el mismo tiempo de cierre del equipo, los resultados son realmente tan inteligente, por lo que, significa que juzgamos la dirección correcta.

Llegar al fondo

De repente se encuentran detrás de los colegas modificado el script de inicio, se añade el guión al final de la línea de comandos

java xxxx &cd $DIR_LOG && tail -f common-*.log

¿Es esto el mando del fantasma?

De repente, un pensamiento al problema de las cuestiones principales y secundarias, en caso de que cuando añadimos una carrera en la cáscara y el caso, cuando el proceso principal a fin, estará directamente vinculado al siguiente proceso init, que es, se mire a través ps-ef el proceso padre será el proceso Nº 1, pero si el proceso padre original no pudo terminar, entonces el proceso padre seguirá siendo el proceso original, por lo que cuando ejecutamos este script se ha ejecutado la cola a la espera de la salida del registro, de modo que Si cerramos la ventana actual, esto significa que el proceso padre saldrá, a continuación, enviar una señal SIGHUP al proceso hijo, lo que conduce a un proceso de java para salir, pero si estamos en el proceso de registro ctrl c cola, y ese proceso se adoptivos java al proceso init, lo que en este momento en el que vamos a cerrar la ventana cuando no da SIGHUP enviado la señal.

Probado realmente el caso, la desaparición de este proceso hasta ahora por fin ha sido explicado, ah, la buena noticia no es nuestro código de problema, por suerte, después de todo, nuestro código se va a ejecutar en el cliente, es necesario para asegurar la estabilidad.

Bienvenido atención comunidades PerfMa Lecturas recomendadas:

Accidentalmente pisó la mina, una verdadera investigación de la filtración de memoria de Java

Con Kafka técnicas rueda de las series de tiempo

Supongo que te gusta

Origin juejin.im/post/5e699cc66fb9a07c86791049
Recomendado
Clasificación