如何查找谁或哪个进程向我在 Solaris 上的进程发送了信号



我有JBoss运行在Sun Java 1.5上。有时,它会意外关闭(以有序的方式)。我怀疑其他一些进程正在发送它杀死或 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来确定信号的来源。 pid 可能为零,因为信号是从内核或通过某些用户交互发送的(按 Ctrl+C)

#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, '', 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;
}

最新更新