找出程式消失的“案發現場”

weixin_33807284發表於2019-01-28
  • 問題來源:

    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

        9004616-e2660e9c0d54d13d
        audit_kill

        檢視審計日誌,如下可以看出,被kill的程式為687802,與上述日誌列印的kafka程式號一致。起16進製為a7eba,與SYSCALl中中的a0一致,起a1表示接收到的為-9,即表示使用“kill -9”命令殺掉的kafka,Broker程式。而執行kill命令的程式為pid為688289,與上述指令碼中列印的命令一致。如上資訊可以說明是執行的kill_test.sh指令碼殺掉了Kafka的broker程式。

相關文章