我的进程去哪儿了,谁杀了我的进程

谁发的信号

回到顶部

  更普遍的,即使我们知道进程被SIGKILL干掉了,这没有什么用。关键是得找出谁发送的这个信号,是故意的还是意外,也许是新手写的脚本误伤,也许是老手故意搞破坏。

  最简单的,那就是查看lasthistory,last看看谁登陆到了系统,然后再用history看看相关的操作记录。可是,操作记录是可以被清除的,history -c可以清除本终端上的操作记录,也可以直接清空、删除.bash_history,也许有更高级的手段来禁止清空操作记录,但到底是道高一尺魔高一丈,还是魔高一尺道高一丈,我也就不清楚了。

systemtap

  在who-killed-my-process-and-why中,指出了其中的一种办法,使用systemtap,笔者也是第一次听说这个家伙,据说非常强大。官方给出了捕获信号的示例代码

复制代码

probe begin
{
  printf("%-8s %-16s %-5s %-16s %6s %-16s\n",
         "SPID", "SNAME", "RPID", "RNAME", "SIGNUM", "SIGNAME")
}

probe signal.send 
{
  if (sig_name == @1 && sig_pid == target())
    printf("%-8d %-16s %-5d %-16s %-6d %-16s\n", 
      pid(), execname(), sig_pid, pid_name, sig, sig_name)
}

复制代码

 

  将上述代码保存为sigmon.stp文件,然后查看待监控的进程的pid,使用下述命令监控发送到该进程的SIGKILL信号

stap -x pid sigmon.stp SIGKILL

   不过这种方法,我并没有实验成功,systemtap的安装太麻烦了。。。

audit

  在Who sends a SIGKILL to my process mysteriously on ubuntu server中,提到了另外一个更加简单的方法,那就是使用audit

  安装很简单:sudo apt-get install auditd

  启动服务并查看状态: service auditd start & service auditd status

  然后通过auditctrl添加规则: auditctl -a exit,always -F arch=b64 -S kill -F a1=9

  启动然后kill掉Python程序

$ python run_forever.py &
[1] 24067
$ kill -9 24067

  使用ausearch搜索结果: ausearch -sc kill。结果如下 

time->Mon Dec 25 19:52:55 2017
type=PROCTITLE msg=audit(1514202775.088:351): proctitle="bash"
type=OBJ_PID msg=audit(1514202775.088:351): opid=24067 日uid=-1 ouid=3010 oses=-1 ocomm="python"
type=SYSCALL msg=audit(1514202775.088:351): arch=c000003e syscall=62 success=yes exit=0 a0=5e03 a1=9 a2=0 a3=7ffc0d9f7b90 items=0 ppid=1349 pid=1350  uid=3010 gid=3010 euid=3010 suid=3010 fsuid=3010 egid=3010 sgid=3010 fsgid=3010 tty=pts0 comm="bash" exe="/bin/bash" key=(null)

 

   可以看到,信号的目标进程是一个python程序,pid是24067,启动该进程的用户的id是3010。kil进程的信号被用户3010在pid为1350的bash中发出。

案例与总结

回到顶部

  我遇到过的,进程悄无声息消失的情况,有以下几种

  (1)进程确实是crash了,不过用于core file size设置的问题,没有生成coredump,这里可以通过ulimit -c确认

  (2)oom,代码bug导致进程占用内存过多,被操作系统干掉

  (3)进程被父进程,或者监控进程(watchdog)给kill掉,这个在使用框架的时候容易出现

  (4)进程被误杀,诸如这样的脚本 kill -9 `ps aux | grep python | awk '{print $2}'`, 杀掉所有的python进程,这是非常粗暴的方法,非常容易误杀

  (5)top,top命令也能杀掉进程,are you kidding me? No

  

  如上图所示,进程9603是一个Python程序,top -c默认按照CPU使用量排序,所以这个CPU 100%的进程在最前面。当按下K键的时候,就会给进程发信号,default pid就是在第一行的进程,当然这里也可以输入pid。直接回车,结果如下图

  

  可以看到,默认的信号是SIGTERM(15),也可以输入信号。在敲回车之后,这个进程就被kill了

  即使查看history命令,也只有一个top命令,完全看不出什么,所以使用top命令也要小心啊,捕获SIGTERM也是一个不错的主意。

 

  当然,做好权限控制,就能减少进程被意外Kill,特别是在线上服务器,适当的监控也是必要的。

  那么当进程消失的时候,可以按照下列步骤排查

  (1)看日志

  (2)查看有没有coredump,查看ulimit -c

  (3)看系统内存使用量,用dmesg看是不是OOM

  (4)看last与history,crontab

  (5)也许一切都在运维的掌控之中 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值