找出进程消失的“案发现场”

  • 问题来源:

    Kafka服务出现访问异常

  • 问题分析:

    查看Broker日志,JVM进程在没有任何异常的情况下,直接被调用shutdownhook,退出应用。
    从Kafka服务来看,无法确诊问题。

    通常此类状态是由于OS中运行的监控管理进程或者其他服务发送kill信号将进程杀掉。如果能够找出发送信号的进程,就可以进 一步分析原因。那么如何查找出“罪魁祸首”?

  • 查找“罪魁祸首”

    The Linux Audit Subsystem is a system to Collect information regarding events occurring on the system(s) 。借助OS审计日志可以找出是否有其他进程,什么进程,什么时候对Kafka的Broker进程发送什么信号导致Kafka的Broker进程退出。那么该如何操作呢?

    1. 首先确保审计服务正常

      使用 service auditd status 查看审计服务的运行情况
      如果运行异常,可使用service auditd restart 重启服务

    2. 在审计服务中添加审计kill操作的审计规则
      auditctl -a exit,always -F arch=b64 -S kill -S tkill -S tgkill -F a1!=0 -k my_temporary_kill_audit
      添加完毕后,可以使用auditctl -l命令查看是否添加成功

       [root@yj01 ~]# auditctl -l
       No rules
       [root@yj01 ~]# auditctl -a exit,always -F arch=b64 -S kill -S tkill -S tgkill -F a1!=0 -k my_temporary_kill_audit
       [root@yj01 ~]# auditctl -l
       -a always,exit -F arch=b64 -S kill,tkill,tgkill -F a1!=0x0 -F key=my_temporary_kill_audit
      
    3. 使用脚本kill掉进程以便测试

       [root@yj01 ~]# cat kill_test.sh 
       #!/bin/bash
       p=`ps -ef | grep kafka.Kafka | grep -v grep | awk '{print $2}'`
       echo "kill ing kafka process $p"
       kill -9  $p
       echo $$
       echo "killed"
      
    4. 测试审计日志信息

      1. 在kafka的broker进程所在节点运行test.sh,打印如下:

         [root@yj01 ~]# date
         Mon Jan 28 10:55:46 CST 2019
         [root@yj01 ~]# sh kill_test.sh 
         kill ing kafka process 687802
         688289
         killed
         [root@yj01 ~]# date
         Mon Jan 28 10:55:50 CST 2019
        
      2. 查看审计日志记录的kill信息

        使用命令ausearch -k my_temporary_kill_audit

        audit_kill

        查看审计日志,如下可以看出,被kill的进程为687802,与上述日志打印的kafka进程号一致。起16进制为a7eba,与SYSCALl中中的a0一致,起a1表示接收到的为-9,即表示使用“kill -9”命令杀掉的kafka,Broker进程。而执行kill命令的进程为pid为688289,与上述脚本中打印的命令一致。如上信息可以说明是执行的kill_test.sh脚本杀掉了Kafka的broker进程。

你可能感兴趣的:(找出进程消失的“案发现场”)