Pour déterminer quel processus envoie le signal à mysqld, il est nécessaire de tracer les signaux via le noyau Linux. Deux options pour ce faire sont :
- le journal d'audit (auditd)
- systemtap
Chacune de ces méthodes sera abordée dans les sections suivantes.
Journal d'audit
Le journal d'audit est simple à configurer, mais ne fournit pas de contrôle précis des processus et des signaux surveillés ; tout est inclus. Ainsi, le journal peut devenir assez bruyant, il est donc recommandé de désactiver la surveillance dès que le processus a été déterminé. Les étapes sont :
1. Configurez auditd pour surveiller les signaux. Cela peut être fait pendant l'exécution ou via le fichier de configuration auditd (/etc/audit/audit.rules ). Comme la sortie du journal ajoutée est assez bruyante (elle enregistre tous les signaux, même kill -0, c'est-à-dire vérifie si un processus est actif) et si la modification est apportée afin de déboguer un seul problème, il est généralement préférable d'effectuer la modification au moment de l'exécution. Pour ce faire, utilisez la commande :
auditctl -a exit,always -F arch=b64 -S kill -k audit_kill
2. Attendez que mysqld soit tué/arrêté par le signal.
3. Arrêtez à nouveau les appels de signal de journalisation auditd, le plus simple est de le redémarrer (si vous avez ajouté une règle dans le fichier de configuration, vous devrez d'abord supprimer la règle) :
# service auditd restart
Le fichier journal (généralement /var/log/audit.log ) devrait maintenant avoir un événement semblable à :
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"
Les parties importantes sont :
Général :
msg=audit(1450214919.813:148) :l'horodatage de l'événement. C'est dans l'époque (heure depuis le 1er janvier 1970 à minuit UTC). Vous pouvez par ex. utilisez la fonction FROM_UNIXTIME() dans MySQL pour la convertir en une date normale :
mysql> SELECT FROM_UNIXTIME(1450214919); +---------------------------+ | FROM_UNIXTIME(1450214919) | +---------------------------+ | 2015-12-16 08:28:39 | +---------------------------+ 1 row in set (0.05 sec)
type=SYSCALL
Informations sur le déclencheur de l'appel système.
appel système=62 :signifie que c'est un signal (tuer):
# ausyscall 62 kill
a1=9 :signifie que le signal est SIGKILL (pour un signal SIGTERM, la valeur est 15).
comm=”mykill” exe=”/opt/bin/mykill” :est le processus qui envoie le signal - c'est ce qui vous intéresse.
key=”audit_kill” :est l'option "-k audit_kill" de la commande auditctl. Cela indique simplement que l'événement a été déclenché par la règle que nous avons ajoutée.
type=OBJ_PID
Informations sur la cible de l'appel système.
opid=3936 :est l'identifiant du processus (comme dans ce que vous voyez en haut ou dans la sortie ps) du processus recevant le signal.
ouid=102 :l'ID utilisateur de l'utilisateur exécutant le processus (comme dans l'ID de /etc/passwd).
ocomm=”mysqld” :le nom du processus.
Vous devez donc rechercher un événement avec type=SYSCALL avec a1=9 et key=”audit_kill” où l'objet suivant a ocomm=”mysqld”.
appui système
systemtap nécessite un script spécifiant ce qui doit être surveillé et ce qui doit être fait avec les informations disponibles. Cela rend son utilisation plus complexe, mais permet également une plus grande flexibilité. Un exemple de script qui surveillera l'envoi de SIGKILL et SIGTERM au processus mysqld est :
#! /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"); }Remarque :Le script ci-dessus est donné à titre d'exemple. Veuillez tester sur un système de test avant de l'utiliser en production.
Enregistrez le script dans un fichier (ce qui suit suppose que le nom du fichier est mysqld_kill_or_term.stp). L'utilisation est :
# 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