Sun Java 1.5でJBossを実行しています。 時々、予期せずシャットダウンします(正常な方法で)。 他のプロセスがkillまたはCTRL + Cシグナルを送信していると思われます。Solaris上で自分のプロセスにシグナルを送信したプロセスやプロセスを見つける方法
誰が信号を送信したかをトレースする方法はありますか?
Sun Java 1.5でJBossを実行しています。 時々、予期せずシャットダウンします(正常な方法で)。 他のプロセスがkillまたはCTRL + Cシグナルを送信していると思われます。Solaris上で自分のプロセスにシグナルを送信したプロセスやプロセスを見つける方法
誰が信号を送信したかをトレースする方法はありますか?
sigaction
を使用して、信号源を特定することができます。信号がカーネルからか、一部のユーザーの相互作用を介して送信されたようpidがゼロであってもよい
#include <signal.h>
#include <string.h>
#include <stdio.h>
static void signal_handler(int sig, siginfo_t *info, void *data) {
printf ("signal: [%d], pid: [%d], uid: [%d]\n", sig,
info->si_pid,
info->si_uid);
}
int main(int argc, char *argv[]) {
struct sigaction sa;
memset (&sa, '\0', sizeof (struct sigaction));
sa.sa_sigaction = &signal_handler;
sa.sa_flags |= SA_SIGINFO;
sigemptyset (&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
while (1) {
sleep (1);
}
return 0;
}
このスクリプトは過去を調査できますか?私のプロセスはもう生きていません。 – erezul
@erezul:いいえ。残念ながら、プログラムは過去を調査することはできません。どのプロセスが信号をJBossプロセスに送信したのかを調べるための死後のメカニズムはありません。シグナル送信者を報告するようにJBossコードをラップすることは可能かもしれませんが、それ以上の大きな作業が必要になるでしょう。 –
Cコードは、Javaベースのアプリケーションサーバーにプラグインするのが特に簡単ではありません。さらに、それを使用する方法は、デフォルトのJVMハンドラをオーバーライドします。最後に、既に述べたように、sigkillはsigactionによって捕まえられません。 – jlliagre
Solarisでは、あなたのプロセスを殺している人を見つけるために、単純なDTraceスクリプトを使用することができます(Ctrl + Cを押す)(と仮定すると、その名前は)それ以外の場合を調整、java
である:いくつかの認可プロセスがSIGKILL信号を送信する場合のJBossプロセスが規則正しくシャットダウンできないこと
dtrace -qn '
proc:::signal-send
/args[1]->pr_fname == "java"/
{
printf("Process %d (%s by UID %d) sending signal %d to java (pid=%d)\n",
pid,execname,uid,arg1,args[1]->pr_pid);
}'
注意。その信号の2番目のチャンスはありません。プロセスはどのプロセスがキャッチ可能なシグナルを送信したかに関する情報をいくつか見つけることができますが、受信プロセスだけが通常のイベントのプロセスでそれを行うことができます。外部監査プログラムがJBossに信号を送った他のプロセスがJBossが亡くなったことを知る方法はありません。死亡が発生する前に実行している場合、 'dtrace'を使ってwhodunnitを追跡することができます。その後、情報は失われます。 –