Java 找到一个正在扼杀我进程的神秘进程

Java 找到一个正在扼杀我进程的神秘进程,java,linux,unix,process,signals,Java,Linux,Unix,Process,Signals,假设我有一个进程——在本例中是一个Java进程,由ant启动。我发现有东西随机发送这个Java进程。它可能是向自身发送信号的过程,也可能是其他过程 我已经消除了大多数明显的原因(oom杀手、父进程杀死子进程等),但我真的很想知道是谁发送了这个进程SIGTERM。有没有办法在操作系统或进程级别跟踪此行为?您确定收到了SIGTERM信号? 您是否尝试过使用linuxstrace命令,看看您有什么信号。我不确定它是否会向您显示发送信号的进程的pid。您可以通过JNI在java程序中安装一个信号处理程序

假设我有一个进程——在本例中是一个Java进程,由ant启动。我发现有东西随机发送这个Java进程。它可能是向自身发送信号的过程,也可能是其他过程


我已经消除了大多数明显的原因(oom杀手、父进程杀死子进程等),但我真的很想知道是谁发送了这个进程SIGTERM。有没有办法在操作系统或进程级别跟踪此行为?

您确定收到了SIGTERM信号?
您是否尝试过使用linux
strace
命令,看看您有什么信号。我不确定它是否会向您显示发送信号的进程的pid。

您可以通过JNI在java程序中安装一个信号处理程序,请参见该示例(捕获SIGALRM,但应易于调整)。但是,在java中处理信号时要注意一些问题(请参阅):基本上,您需要注意将信号处理程序链接到现有的,而不是替换它们

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


我将在我的电脑上运行的东西放在一起:

如果您有可用的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);
}
#/usr/sbin/dtrace-qCs
#包括
过程:::信号发送
/args[2]==SIGTERM&&args[1]->pr\u fname==java/
{
printf(“uid%d运行的进程%d(%s)正在将SIGTERM发送到java(pid%d)\n”,
pid,execname,uid,args[1]->pr\u pid);
}

我不知道java是否具有对
sigaction()的本机或包装访问权限
,但是当使用sau SIGINFO字段调用时,pid和真实uid将传递给您设置的处理程序。您可能能够通过这种方式抓住罪犯。是的,如果它是C的话。Java确实提供了一些有限的信号处理,但无法访问发送方的pid/uid。是的,我们可以看到我们得到的sigterm是基于返回值-143=128+sigterm的。