4

いくつかのプロセスがあるとしましょう。この場合は、ant によって起動された Java プロセスです。ランダムに何かがこの Java プロセス SIGTERM を送信していることを発見しました。それは、そのシグナルを自分自身に送信しているプロセスである可能性もあれば、他の何かである可能性もあります。

明白な原因のほとんどを排除しました(oom killer、親プロセスによる子プロセスの強制終了など) 。OSまたはプロセスレベルでこの動作を追跡する方法はありますか?

4

3 に答える 3

2

JNI 経由で Java プログラムにシグナル ハンドラをインストールできます。その例については、 JNI を使用した C タイマー ライブラリを使用した java インターフェースを参照してください(SIGALRM をキャッチしますが、簡単に適応できるはずです)。ただし、Java でシグナルをいじる際にはいくつかの問題に注意してください ( http://nerds-central.blogspot.de/2011/04/java-jvm-jni-and-signal-handling.htmlを参照):シグナルハンドラを既存のものにチェーンし、それらを置き換えないように注意してください。

人間の介入が疑われる場合、別のアプローチkillとして、このミステリーが発生したマシン上の実行可能ファイルを変更することがあります。ログインしているユーザー、その PID および親 PID をログに記録し、元の kill を呼び出すシェル スクリプトに置き換えます。

私は自分の PC で動作するものをまとめました: https://gist.github.com/4183018

于 2012-12-01T14:28:03.023 に答える
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);
}
于 2012-12-01T23:16:04.097 に答える
0

SIGTERM シグナルを受け取っていますか? Linuxstraceコマンドを使用してみて、どのような信号があるかを確認してください。ただし、シグナルを送信したプロセスのpidが表示されるかどうかはわかりません。

于 2012-07-04T04:32:49.590 に答える