找到一个杀死我的过程的神秘过程

时间:2012-07-04 02:54:46

标签: java linux unix process signals

假设我有一些进程 - 在这种情况下是由ant发起的Java进程。我发现随机的东西正在发送这个Java进程SIGTERM。它可能是将信号发送给自己的过程,也可能是其他信号。

我已经消除了大部分明显的原因(oom杀手,父进程杀死孩子等),但我真的想找出正在发送此进程SIGTERM。有没有办法在操作系统或流程级别跟踪此行为?

3 个答案:

答案 0 :(得分:1)

您可以通过JNI在Java程序中安装信号处理程序,请参阅interface java with C timer library using JNI以获取示例(捕获SIGALRM,但应该很容易适应)。但是,在使用java中的信号时要小心一些问题(参见http://nerds-central.blogspot.de/2011/04/java-jvm-jni-and-signal-handling.html):基本上你需要注意将信号处理程序链接到现有信号处理程序而不是替换它们。

如果您怀疑人为交互,另一种方法可能是修改发生此谜团的机器上的kill可执行文件。将其替换为记录谁登录的shell脚本,其PID和父PID,然后调用原始kill。

我把可以在我的电脑上工作的东西放在一起:https://gist.github.com/4183018

答案 1 :(得分:0)

你确定你收到了SIGTERM信号吗? 您是否尝试使用linux strace命令并查看您有什么信号。我不确定它会告诉你发送信号的过程的pid。

答案 2 :(得分:0)

如果您有dtrace可用(Solaris,OS X,FreeBSD),这个简单的Dtrace脚本可以轻松检测到神秘过程:

#!/usr/sbin/dtrace -qCs

#include <signal.h>

proc:::signal-send
/ args[2] == SIGTERM && args[1]->pr_fname == "java" /
{
    printf("Process %d (%s) run by uid %d is sending SIGTERM to java (pid %d)\n",
            pid, execname, uid, args[1]->pr_pid);
}