GNU/Linux >> LINUX-Kenntnisse >  >> Cent OS

So finden Sie heraus, welcher Prozess mysqld mit SIGKILL oder SIGTERM unter Linux zerstört

Um festzustellen, welcher Prozess das Signal an mysqld sendet, ist es notwendig, die Signale durch den Linux-Kernel zu verfolgen. Dazu gibt es zwei Möglichkeiten:

  1. das Prüfprotokoll (auditd)
  2. Systemtipp

Jede dieser Methoden wird in den folgenden Abschnitten besprochen.

Prüfprotokoll

Das Prüfprotokoll ist einfach einzurichten, bietet jedoch keine feinkörnige Kontrolle darüber, welche Prozesse und Signale überwacht werden; alles ist enthalten. Das Protokoll kann also ziemlich laut werden, daher empfiehlt es sich, die Überwachung zu deaktivieren, sobald der Prozess festgestellt wurde. Die Schritte sind:

1. Konfigurieren Sie auditd so, dass es auf Signale überwacht. Dies kann zur Laufzeit oder über die auditd-Konfigurationsdatei (/etc/audit/audit.rules) erfolgen ). Da die hinzugefügte Protokollausgabe ziemlich verrauscht ist (sie protokolliert alle Signale, sogar kill -0, d. h. überprüft, ob ein Prozess aktiv ist) und wenn die Änderung vorgenommen wird, um ein einzelnes Problem zu debuggen, ist es normalerweise vorzuziehen, die Änderung zur Laufzeit vorzunehmen. Das machst du mit dem Befehl:

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

2. Warten Sie, bis mysqld durch das Signal beendet/heruntergefahren wird.

3. Stoppen Sie auditd-Protokollierungssignalaufrufe erneut, am einfachsten ist es, es neu zu starten (wenn Sie eine Regel in der Konfigurationsdatei hinzugefügt haben, müssen Sie die Regel zuerst entfernen):

# service auditd restart

Die Protokolldatei (normalerweise /var/log/audit.log ) sollte nun ein ähnliches Ereignis haben wie:

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"

Die wichtigen Teile sind:

Allgemeines:

msg=audit(1450214919.813:148) :der Zeitstempel des Ereignisses. Dies ist eine Epoche (Zeit seit dem 1. Januar 1970 um Mitternacht UTC). Sie können z. Verwenden Sie die Funktion FROM_UNIXTIME() in MySQL, um es in ein normales Datum umzuwandeln:

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

type=SYSCALL

Informationen über den Auslöser des Systemaufrufs.

syscall=62 :bedeutet, dass es ein Signal ist (kill):

# ausyscall 62
kill

a1=9 :bedeutet, dass das Signal SIGKILL ist (für ein SIGTERM-Signal ist der Wert 15).
comm=”mykill” exe=”/opt/bin/mykill” :ist der Prozess, der das Signal sendet – das interessiert Sie.
key=”audit_kill” :ist die Option „-k audit_kill“ aus dem auditctl-Befehl. Es teilt lediglich mit, dass das Ereignis durch die von uns hinzugefügte Regel ausgelöst wurde.

type=OBJ_PID

Informationen über das Ziel des Systemaufrufs.

opid=3936 :ist die Prozess-ID (wie oben oder in der ps-Ausgabe) des Prozesses, der das Signal empfängt.
ouid=102 :die Benutzer-ID des Benutzers, der den Prozess ausführt (wie in der ID von /etc/passwd).
ocomm=”mysqld” :der Name des Prozesses.

Sie müssen also nach einem Ereignis mit type=SYSCALL mit a1=9 und key=“audit_kill“ suchen, wobei das folgende Objekt ocomm=“mysqld“ hat.

Systemtipp

systemtap erfordert ein Skript, das angibt, was überwacht werden soll und was mit den verfügbaren Informationen geschehen soll. Dies macht es komplexer in der Anwendung, ermöglicht aber auch eine viel größere Flexibilität. Ein Beispielskript, das das Senden von SIGKILL und SIGTERM an den mysqld-Prozess überwacht, ist:

#! /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");
}
Hinweis :Das obige Skript ist als Beispiel gedacht. Bitte testen Sie auf einem Testsystem, bevor Sie es in der Produktion verwenden.

Speichern Sie das Skript in einer Datei (im Folgenden wird davon ausgegangen, dass der Dateiname mysqld_kill_or_term.stp lautet). Die Verwendung ist:

# 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. Linux – So finden Sie die Java-Version im installierten Java-Ordner

  2. So finden Sie heraus, welche Shell Sie unter Linux verwenden

  3. So bestimmen Sie, welcher Prozess in Linux auf die Festplatte schreibt

  4. Wie finde ich alle Dateien mit der Endung .rb unter Linux?

  5. Wie finden Sie heraus, welcher Prozess eine Datei in Linux verwendet?

So finden Sie installierte Anwendungen mit installierter Größe in Linux

So finden Sie heraus, zu welchen Gruppen ein Benutzer in Linux gehört

So finden und beenden Sie laufende Prozesse in Linux

So finden Sie Dateien mit dem fd-Befehl in Linux

So finden Sie heraus, welche Grafikkarte Sie unter Linux haben

So finden Sie die PID und PPID eines Prozesses in Linux