シグナルを mysqld に送信しているプロセスを特定するには、Linux カーネルを通じてシグナルを追跡する必要があります。これを行うための 2 つのオプションは次のとおりです。
<オール>これらの各方法については、次のセクションで説明します。
監査ログ
監査ログは簡単に設定できますが、監視対象のプロセスとシグナルを細かく制御することはできません。すべてが含まれています。そのため、ログは非常にノイズが多くなる可能性があるため、プロセスが特定されたらすぐに監視を無効にすることをお勧めします。手順は次のとおりです。
1. シグナルを監視するように auditd を設定します。これは実行時に行うことも、auditd 構成ファイル (/etc/audit/audit.rules) を介して行うこともできます。 )。追加されたログ出力はかなりノイズが多く (kill -0 を含むすべてのシグナルをログに記録します。つまり、プロセスが生きているかどうかを確認します)、1 つの問題をデバッグするために変更が行われるため、通常は実行時に変更することをお勧めします。これは次のコマンドで行います:
auditctl -a exit,always -F arch=b64 -S kill -k audit_kill
2. シグナルによって mysqld が強制終了/シャットダウンされるのを待ちます。
3. auditd のログ シグナル呼び出しを再度停止します。最も簡単な方法は、再起動することです (構成ファイルにルールを追加した場合は、最初にルールを削除する必要があります)。
# service auditd restart
ログ ファイル (通常は /var/log/audit.log ) には次のようなイベントが含まれているはずです:
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"
重要な部分は次のとおりです:
一般:
msg=audit(1450214919.813:148) :イベントのタイムスタンプ。これはエポック (1970 年 1 月 1 日午前 0 時 UTC からの時間) です。たとえば、次のことができます。 MySQL の FROM_UNIXTIME() 関数を使用して、通常の日付に変換します:
mysql> SELECT FROM_UNIXTIME(1450214919); +---------------------------+ | FROM_UNIXTIME(1450214919) | +---------------------------+ | 2015-12-16 08:28:39 | +---------------------------+ 1 row in set (0.05 sec)
type=SYSCALL
システムコールのトリガーに関する情報。
syscall=62 :シグナル (kill) であることを意味します:
# ausyscall 62 kill
a1=9 :シグナルが SIGKILL であることを意味します (SIGTERM シグナルの場合、値は 15 です)。
comm=”mykill” exe=”/opt/bin/mykill” :シグナルを送信するプロセスです。これは、関心のあることです。
key="audit_kill" :auditctl コマンドの「-k audit_kill」オプションです。追加したルールによってイベントがトリガーされたことを示すだけです。
type=OBJ_PID
システムコールのターゲットに関する情報。
opid=3936 :シグナルを受信するプロセスのプロセス ID (top または ps 出力に表示されるもの) です。
ouid=102 :プロセスを実行しているユーザーのユーザー ID (/etc/passwd の ID など)。
ocomm="mysqld" :プロセスの名前。
したがって、次のオブジェクトが ocomm="mysqld" である場合、type=SYSCALL で a1=9 および key="audit_kill" のイベントを探す必要があります。
システムタップ
systemtap には、何を監視し、利用可能な情報で何を行うべきかを指定するスクリプトが必要です。これにより、使用がより複雑になりますが、柔軟性も大幅に向上します。 mysqld プロセスに送信される SIGKILL および SIGTERM を監視するスクリプトの例:
#! /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"); }注意 :上記のスクリプトは一例です。本番環境で使用する前に、テスト システムでテストしてください。
スクリプトをファイルに保存します (以下では、ファイル名が mysqld_kill_or_term.stp であると想定しています)。使用法は次のとおりです:
# 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