【问题标题】:Find a mystery process which is killing my process找到一个正在杀死我的进程的神秘进程
【发布时间】:2012-07-04 12:43:58
【问题描述】:

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

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

【问题讨论】:

  • 我不知道 java 是否有一些对 sigaction() 的本机或包装访问,但是当使用 SA_SIGINFO 字段调用时,pid 和真实 uid 将传递给您设置的处理程序。你也许可以这样抓住你的罪魁祸首。
  • 是的,如果它是 C 语言就好了。Java 确实提供了一些有限的信号处理,但无法访问发送者的 pid/uid。

标签: java linux unix process signals


【解决方案1】:

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

【讨论】:

  • 是的,我们可以看到我们正在根据返回值获取 sigterm - 143 = 128 + SIGTERM。
【解决方案2】:

您可以通过 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

【讨论】:

    【解决方案3】:

    如果您有可用的 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多