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:
- el registro de auditoría (auditd)
- 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
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