GNU/Linux >> Belajar Linux >  >> Cent OS

Bagaimana menemukan Proses Yang Membunuh mysqld Dengan SIGKILL atau SIGTERM di Linux

Untuk menentukan proses mana yang mengirimkan sinyal ke mysqld, perlu untuk melacak sinyal melalui kernel Linux. Dua opsi untuk melakukan ini adalah:

  1. log audit (auditd)
  2. ketuk sistem

Masing-masing metode ini akan dibahas di bagian berikut.

Log Audit

Log audit mudah disiapkan, tetapi tidak memberikan kontrol yang baik tentang proses dan sinyal mana yang dipantau; semuanya disertakan. Jadi log bisa menjadi sangat bising, jadi disarankan untuk menonaktifkan pemantauan segera setelah proses ditentukan. Langkah-langkahnya adalah:

1. Konfigurasikan auditd untuk memantau sinyal. Ini dapat dilakukan saat runtime atau melalui file konfigurasi auditd (/etc/audit/audit.rules ). Karena output log yang ditambahkan cukup berisik (ini mencatat semua sinyal bahkan membunuh -0 yaitu memeriksa apakah suatu proses masih hidup) dan perubahan dilakukan untuk men-debug satu masalah, biasanya lebih baik membuat perubahan saat runtime. Anda melakukannya dengan perintah:

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

2. Tunggu mysqld dimatikan/dimatikan oleh sinyal.

3. Hentikan panggilan sinyal logging auditd lagi, yang paling sederhana adalah memulai kembali (jika Anda menambahkan aturan dalam file konfigurasi, Anda harus menghapus aturan terlebih dahulu):

# service auditd restart

File log (biasanya /var/log/audit.log ) sekarang harus memiliki acara yang mirip dengan:

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"

Bagian-bagian penting adalah:

Umum:

msg=audit(1450214919.813:148) :stempel waktu acara. Ini dalam epoch (waktu sejak 1 Januari 1970 pada tengah malam UTC). Anda bisa misalnya gunakan fungsi FROM_UNIXTIME() di MySQL untuk mengubahnya menjadi tanggal normal:

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

type=SYSCALL

Informasi tentang pemicu syscall.

syscall=62 :berarti itu sinyal (membunuh):

# ausyscall 62
kill

a1=9 :berarti sinyalnya adalah SIGKILL (untuk sinyal SIGTERM, nilainya adalah 15).
comm=”mykill” exe=”/opt/bin/mykill” :adalah proses yang mengirimkan sinyal – inilah yang Anda minati.
key=”audit_kill” :adalah opsi “-k audit_kill” dari perintah auditctl. Itu hanya memberi tahu bahwa acara dipicu oleh aturan yang kami tambahkan.

type=OBJ_PID

Informasi tentang target syscall.

opid=3936 :adalah id proses (seperti yang Anda lihat di atas atau keluaran ps) dari proses yang menerima sinyal.
ouid=102 :userid dari pengguna yang menjalankan proses (seperti pada id dari /etc/passwd).
ocomm=”mysqld” :nama proses.

Jadi Anda perlu mencari event dengan type=SYSCALL dengan a1=9 dan key=”audit_kill” dimana objek berikut memiliki ocomm=”mysqld”.

ketuk sistem

systemtap memerlukan skrip yang menentukan apa yang harus dipantau dan apa yang harus dilakukan dengan informasi yang tersedia. Ini membuatnya lebih kompleks untuk digunakan, tetapi juga memungkinkan fleksibilitas yang lebih besar. Contoh script yang akan memonitor pengiriman SIGKILL dan SIGTERM ke proses mysqld adalah:

#! /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");
}
Catatan :Script di atas dimaksudkan sebagai contoh. Silakan uji pada sistem uji sebelum menggunakannya dalam produksi.

Simpan skrip ke file (berikut ini mengasumsikan nama file adalah mysqld_kill_or_term.stp). Penggunaannya adalah:

# 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. Cara Menemukan Shell Yang Anda Gunakan di Linux

  2. Cara Menentukan Proses Yang Menulis ke Disk di Linux

  3. Bagaimana cara menghapus file dengan nama ini di linux:-]???????q

  1. Linux – Bagaimana Cara Mengetahui Namespace Dari Proses Tertentu?

  2. Linux – Bagaimana Menemukan Versi Java Di Folder yang Diinstal Java?

  3. Cara Menemukan File dengan Perintah fd di Linux

  1. Bagaimana menemukan semua file yang diakhiri dengan .rb dengan Linux?

  2. Bagaimana saya bisa tahu di Linux proses mana yang mengirim sinyal ke proses saya

  3. Bagaimana cara mengetahui proses mana yang menggunakan file di Linux?