假设我有一些进程——在本例中是一个由 ant 启动的 Java 进程。我发现随机发送此 Java 进程 SIGTERM。它可能是向自身发送该信号的过程,也可能是其他东西。
我已经消除了大部分明显的原因(oom 杀手、父进程杀死孩子等),但我真的很想找出是谁在发送这个进程的 SIGTERM。有什么方法可以在操作系统或进程级别跟踪此行为?
您可以通过 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
你确定你收到 SIGTERM 信号吗?您是否尝试过使用 linuxstrace
命令并查看您有什么信号。我不确定它是否会向您显示发送信号的进程的 pid。
如果您有可用的 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);
}