Linux如何找到发出 kill -9 信号的真凶?

系统 Linux
生产环境遇到一个神奇的问题,某个进程运行一段时间后,就莫名其妙地被干掉了。初步怀疑是被操作系统OOM killer干掉的,但查看了dmesg日志以及系统内存监控数据,发现内存充足也没有达到cgroup限制,排除了操作系统OMM killer干的。

 

生产环境遇到一个神奇的问题,某个进程运行一段时间后,就莫名其妙地被干掉了。初步怀疑是被操作系统OOM killer干掉的,但查看了dmesg日志以及系统内存监控数据,发现内存充足也没有达到cgroup限制,排除了操作系统OMM killer干的。

应该是被其他进程干掉了,但系统里面进程这么多,怎么知道是哪个进程发出的kill信号呢?我们知道,sigkill(kill -9)是无法屏蔽并且不允许注册handler的。

今天给大家介绍一个神器bpftrace,之前介绍BPF入门的文章里面已经介绍了通过bpf拦截sys_clone系统调用了。原理类似,我们可以通过bpftrace拦截kill系统调用,从而找出杀死进程的罪魁祸首。

脚本非常简单,如下所示,主要就是在进入系统调用sys_enter_kill注册 以及 结束系统调用sys_exit_kill的时候获取并打印发出信号的pid和信号编号。

  1. BEGIN 
  2.     printf("Tracing kill() signals... Hit Ctrl-C to end.\n"); 
  3.     printf("%-9s %-6s %-16s %-4s %-6s %s\n""TIME""PID""COMM""SIG"
  4.         "TPID""RESULT"); 
  5.  
  6. tracepoint:syscalls:sys_enter_kill 
  7.     @tpid[tid] = args->pid; 
  8.     @tsig[tid] = args->sig; 
  9.  
  10. tracepoint:syscalls:sys_exit_kill 
  11. /@tpid[tid]/ 
  12.     time("%H:%M:%S  "); 
  13.     printf("%-6d %-16s %-4d %-6d %d\n", pid, comm, @tsig[tid], @tpid[tid], 
  14.         args->ret); 
  15.     delete(@tpid[tid]); 
  16.     delete(@tsig[tid]); 

我们可以先启动一个sleep的Demo测试

  1. # sleep 444 

执行上面的脚本后,通过 ”kill -9 “杀死上面启动sleep 任务,可以脚本输出如下:

  1. TIME      PID    COMM             SIG  TPID   RESULT 
  2. 11:38:43  2837583 bash             9    2837548 0 

其中,TIME代表执行时间,PID代表发出信号的进程ID,COMM代表发出信号进程命令行,由于是在bash环境中执行的kill -9 所以这里显示bash,SIG代表信号编号,本例中是kill -9 信号,TPID是sleep任务的线程ID,RESULT代表执行结果,0代表成功。”杀手“和”受害者“都已经成功显示。

最终通过上面的脚本找到了系统上面一个自动清理程序,由于使用了通配符导致误杀的情况。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2015-02-06 10:29:22

2022-04-14 11:17:41

MySQL字符配置

2013-12-03 09:12:37

Linux命令kill命令

2014-06-10 10:47:37

2019-10-11 08:00:00

Linux命令最大文件

2016-08-16 08:26:19

Linuxsignalsigaction

2021-05-25 09:30:44

kill -9Linux kill -9 pid

2011-08-12 14:53:56

kill中文man

2023-01-05 16:02:40

Linux扬声器

2018-07-04 09:44:36

mysql10亿alter

2018-05-28 11:10:08

Linux命令IP地址

2009-10-20 09:19:11

Linux kill命

2022-11-17 00:04:38

接口性能查询

2021-10-25 12:23:06

Linux僵尸进程

2021-02-03 10:43:54

Linux系统磁盘

2018-04-27 14:58:09

Linuxkill命令

2010-06-07 12:51:51

Linux 查看进程

2023-05-25 18:02:47

KVMLinux命令

2012-01-18 10:53:08

iOS小游戏

2017-05-05 11:55:09

路由器WIFI信号虚拟屏幕
点赞
收藏

51CTO技术栈公众号