GNU/Linux >> Tutoriels Linux >  >> Cent OS

Comment trouver quel processus tue mysqld avec SIGKILL ou SIGTERM sous Linux

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 :

  1. le journal d'audit (auditd)
  2. 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


Cent OS
  1. Comment rechercher des fichiers avec la commande fd sous Linux

  2. Comment déterminer quel processus écrit sur le disque sous Linux

  3. Comment trouver tous les fichiers se terminant par .rb avec Linux ?

  4. Comment puis-je savoir sous Linux quel processus a envoyé un signal à mon processus

  5. Comment savoir quel processus utilise un fichier sous Linux ?

Comment trouver des applications installées avec une taille installée sous Linux

Comment savoir à quels groupes un utilisateur appartient sous Linux

Comment trouver et tuer les processus en cours d'exécution sous Linux

Comment rechercher des fichiers avec la commande fd sous Linux

Comment trouver quelle carte graphique avez-vous sous Linux ?

Comment trouver le PID et le PPID d'un processus sous Linux