プロセスへの SIGKILL の送信元を追跡する方法
Environment
- Red Hat Enterprise Linux 4
- Red Hat Enterprise Linux 5
- Red Hat Enterprise Linux 6
Issue
プロセスが突然終了した問題について調査していて、プロセスが SIGKILL シグナルを受信したことを突き止めました。
ただし、その kill の理由について説明しているログメッセージがありません。誰がそのプロセスに kill シグナルを送信したのか、どのようにして確認できますか?
Resolution
audit の使用
kill シグナルをキャプチャーする監査ルールを設定できます。
以下のようなルールです。
# auditctl -a exit,always -F arch=b64 -S kill
# auditctl -a exit,always -F arch=b32 -S kill
# auditctl -a exit,always -F arch=b64 -S tkill
# auditctl -a exit,always -F arch=b32 -S tkill
# auditctl -a exit,always -F arch=b64 -S tgkill
# auditctl -a exit,always -F arch=b32 -S tgkill
次に、以下のようにプロセスの kill を試してください。
# killall -9 <procname>
これにより、以下のような結果が /var/log/audit/audit.log
に出力されます。
type=SYSCALL msg=audit(1342619362.183:8): arch=40000003 syscall=37 success=yes exit=0
a0=f5d a1=9 a2=f5d a3=0 items=0 pid=3936 auid=4294967295 uid=0 gid=0 euid=0 suid=0
fsuid=0 egid=0 sgid=0 fsgid=0 comm="killall" exe="/usr/bin/killall"
説明:
syscall=37
は、audit によって傍受された syscall のコードを示しています。pid=3936
はそのコールを行っているプロセスの PID です。
RHEL4 で利用可能な syscall の一覧とその番号は、それぞれ以下のファイルに記載されています。
/usr/src/kernels/<version>/include/asm-i386/unistd.h
for i386 systems/usr/src/kernels/<version>/include/asm-x86_64/unistd.h
for x86_64 systems
これらのファイルは、kernel-devel
rpm パッケージに含まれています。
SystemTap の使用
1) システムタップをインストールします。
2) sigmon Systentap スクリプトを使用します。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments