Sun Java 1.5 で JBoss を実行しています。ときどき、予期せずシャットダウンします (整然とした方法で)。他のプロセスが kill または CTRL+C シグナルを送信していると思われます。
Unix/Solaris で信号の送信者を追跡する方法はありますか?
Solaris では、単純な dtrace スクリプトを使用して、プロセスを強制終了しているユーザーを見つけることができます (名前がjava
であると仮定して、それ以外の場合は調整してください)。
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);
}'
sigaction
信号の発信元を特定するために使用できます。シグナルがカーネルから送信されたか、何らかのユーザー操作 (ctrl+c を押す) を介して送信されたため、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;
}