如何在Solaris上查找向我的进程发送信号的人员或进程

时间:2012-05-05 14:12:47

标签: unix solaris signals

我在Sun Java 1.5上运行JBoss。 它不时地意外关闭(以有序的方式)。 我怀疑其他一些进程正在发送kill或CTRL + C信号。

在Unix / Solaris上是否有办法追踪发送信号的人?

2 个答案:

答案 0 :(得分:5)

在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);
}'

答案 1 :(得分:1)

您可以使用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;
}