GNU/Linux >> Tutoriales Linux >  >> Cent OS

Cómo encontrar qué proceso está matando a mysqld con SIGKILL o SIGTERM en Linux

Para determinar qué proceso está enviando la señal a mysqld, es necesario rastrear las señales a través del kernel de Linux. Dos opciones para hacer esto son:

  1. el registro de auditoría (auditd)
  2. toque del sistema

Cada uno de estos métodos se discutirá en las siguientes secciones.

Registro de auditoría

El registro de auditoría es fácil de configurar, pero no proporciona un control detallado de qué procesos y señales se monitorean; todo está incluido Por lo tanto, el registro puede volverse bastante ruidoso, por lo que se recomienda desactivar la supervisión tan pronto como se haya determinado el proceso. Los pasos son:

1. Configure auditd para monitorear señales. Esto se puede hacer en tiempo de ejecución o a través del archivo de configuración auditd (/etc/audit/audit.rules ). Como la salida de registro añadida es bastante ruidosa (registra todas las señales incluso kill -0, es decir, comprueba si un proceso está activo) y si el cambio se realiza para depurar un solo problema, generalmente es preferible realizar el cambio en tiempo de ejecución. Haces esto con el comando:

 auditctl -a exit,always -F arch=b64 -S kill -k audit_kill

2. Espere a que la señal elimine/apague mysqld.

3. Detenga las llamadas de señal de registro auditd nuevamente, lo más simple es reiniciarlo (si agregó una regla en el archivo de configuración, primero deberá eliminar la regla):

# service auditd restart

El archivo de registro (generalmente /var/log/audit.log ) ahora debería tener un evento similar a:

type=SYSCALL msg=audit(1450214919.813:148): arch=c000003e syscall=62 success=yes exit=0 a0=f60 a1=9 a2=7f736e706980 a3=0 items=0 ppid=3649 pid=3997 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=1 comm="mykill" exe="/opt/bin/mykill" subj=user_u:system_r:unconfined_t:s0 key="audit_kill"
type=OBJ_PID msg=audit(1450214919.813:148): opid=3936 oauid=500 ouid=102 oses=1 obj=user_u:system_r:mysqld_t:s0 ocomm="mysqld"

Las partes importantes son:

Generalidades:

mensaje=auditoría(1450214919.813:148) :la marca de tiempo del evento. Esto es en época (tiempo desde el 1 de enero de 1970 a la medianoche UTC). Puede, por ejemplo, use la función FROM_UNIXTIME() en MySQL para convertirla en una fecha normal:

mysql> SELECT FROM_UNIXTIME(1450214919);
+---------------------------+
| FROM_UNIXTIME(1450214919) |
+---------------------------+
| 2015-12-16 08:28:39       |
+---------------------------+
1 row in set (0.05 sec)

tipo=LLAMADA AL SISTEMA

Información sobre el desencadenante de la llamada al sistema.

llamada al sistema=62 :significa que es una señal (matar):

# ausyscall 62
kill

a1=9 :significa que la señal es SIGKILL (para una señal SIGTERM, el valor es 15).
comm=”mykill” exe=”/opt/bin/mykill” :es el proceso que envía la señal:esto es lo que le interesa.
key=”audit_kill” :es la opción “-k audit_kill” del comando auditctl. Simplemente indica que el evento fue activado por la regla que agregamos.

tipo=OBJ_PID

Información sobre el destino de la llamada al sistema.

opid=3936 :es la identificación del proceso (como se ve en la parte superior o la salida de ps) del proceso que recibe la señal.
ouid=102 :el ID de usuario del usuario que ejecuta el proceso (como en el ID de /etc/passwd).
ocomm=”mysqld” :el nombre del proceso.

Por lo tanto, debe buscar un evento con type=SYSCALL with a1=9 and key=”audit_kill” donde el siguiente objeto tiene ocomm=”mysqld”.

pulsación del sistema

systemtap requiere un script que especifique qué se debe monitorear y qué se debe hacer con la información disponible. Esto hace que su uso sea más complejo, pero también permite una mayor flexibilidad. Un script de ejemplo que monitoreará los envíos SIGKILL y SIGTERM al proceso mysqld es:

#! /usr/bin/env stap
#
# This systemtap script will monitor for SIGKILL and SIGTERM signals send to
# a process named "mysqld".
#

probe signal.send {
  if (
    (sig_name == "SIGKILL" || sig_name == "SIGTERM")
    && pid_name == "mysqld"
  ) {
    printf("%10d   %-34s   %-10s   %5d   %-7s   %s\n",
      gettimeofday_s(), tz_ctime(gettimeofday_s()),
      pid_name, sig_pid, sig_name, execname());
  }
}

probe begin {
  printf("systemtap script started at: %s\n\n", tz_ctime(gettimeofday_s()));
  printf("%50s%-18s\n",
    "",  "Signaled Process");
  printf("%-10s   %-34s   %-10s   %5s   %-7s   %s\n",
    "Epoch", "Time of Signal", "Name", "PID", "Signal", "Signaling Process Name");
  printf("---------------------------------------------------------------");
  printf("---------------------------------------------------------------");
  printf("\n");
}

probe end {
  printf("\n");
}
Nota :La secuencia de comandos anterior se entiende como ejemplo. Realice una prueba en un sistema de prueba antes de usarlo en producción.

Guarde el script en un archivo (a continuación se supone que el nombre del archivo es mysqld_kill_or_term.stp). El uso es:

# stap mysqld_kill_or_term.stp
systemtap script started at: Fri Dec 18 13:35:44 2015 AEDT

                                                  Signaled Process
Epoch        Time of Signal                       Name           PID   Signal    Signaling Process Name
------------------------------------------------------------------------------------------------------------------------------
1450406150   Fri Dec 18 13:35:50 2015 AEDT        mysqld       21578   SIGKILL   mykill
1450406161   Fri Dec 18 13:36:01 2015 AEDT        mysqld       21942   SIGKILL   mykill
1450406171   Fri Dec 18 13:36:11 2015 AEDT        mysqld       22045   SIGTERM   mykill
^C


Cent OS
  1. Cómo encontrar y matar el proceso Zombie en Linux

  2. Linux:¿cómo averiguar el espacio de nombres de un proceso en particular?

  3. Cómo encontrar qué Shell está utilizando en Linux

  4. Cómo encontrar archivos con el comando fd en Linux

  5. ¿Cómo verificar qué zona horaria en Linux?

Cómo encontrar aplicaciones instaladas con tamaño instalado en Linux

Cómo saber a qué grupos pertenece un usuario en Linux

Cómo encontrar y matar procesos en ejecución en Linux

Cómo encontrar archivos con el comando fd en Linux

¿Cómo encontrar qué tarjeta gráfica tienes en Linux?

Cómo encontrar el PID y PPID de un proceso en Linux