So ermitteln Sie die Quelle eines POSIX-Signals

13

Gibt es eine Möglichkeit, den Ursprung eines in Red Hat Enterprise Linux 5 (SIGTERM usw.) gesendeten Signals herauszufinden? Ich fange regelmäßig einen BEGRIFF in einer Anwendung ein und habe keine Ahnung, woher er kommt.

user27451
quelle

Antworten:

14

Die Manpage für sigaction(2)schlägt vor, dass die PID des Signalsenders in der an Ihren Signalhandler übergebenen Struktur siginfo_t verfügbar ist. Dies setzt natürlich voraus, dass Sie sigaction () verwenden.

Von der Manpage:

Die Sigaktionsstruktur ist wie folgt definiert:

   struct sigaction {
       void     (*sa_handler)(int);
       void     (*sa_sigaction)(int, siginfo_t *, void *);
       sigset_t   sa_mask;
       int        sa_flags;
       void     (*sa_restorer)(void);
   };

Und die siginfo_tStruktur sieht so aus:

   siginfo_t {
       int      si_signo;    /* Signal number */
       int      si_errno;    /* An errno value */
       int      si_code;     /* Signal code */
       int      si_trapno;   /* Trap number that caused
                                hardware-generated signal
                                (unused on most architectures) */
       pid_t    si_pid;      /* Sending process ID */
       uid_t    si_uid;      /* Real user ID of sending process */
       int      si_status;   /* Exit value or signal */
       clock_t  si_utime;    /* User time consumed */
       clock_t  si_stime;    /* System time consumed */
       sigval_t si_value;    /* Signal value */
       int      si_int;      /* POSIX.1b signal */
       void    *si_ptr;      /* POSIX.1b signal */
       int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
       int      si_timerid;  /* Timer ID; POSIX.1b timers */
       void    *si_addr;     /* Memory location which caused fault */
       int      si_band;     /* Band event */
       int      si_fd;       /* File descriptor */
   }
larsks
quelle
Danke für die Antwort, habe nicht so viele Details erwartet. Ich verwende Java Service Wrapper und wenn "debuggen" eingestellt ist, wird so etwas gedruckt: Signal überfüllt. Details: Signalnummer = 15 (SIGTERM), Quelle = "Kill, Sigsend oder Raise" -Signal, generiert durch PID: 2194 (Session PID: 2164), UID: 1002 (im Freien) die Wrapper-Unix-C-Quelle. :-)
user27451
1

Auf Plattformen mit DTrace (OS X, Solaris,… andere?) Können Sie es mit einem Test wie diesem verwenden, um die gewünschten Informationen zu protokollieren:

sudo dtrace -n 'proc:::signal-send { printf("Process %d (%s by UID %d) sending signal %d to pid=%d\n",pid,execname,uid,args[2],args[1]->pr_pid); }'

Ich habe dies anhand eines Skripts unter http://www.brendangregg.com/DTrace/dtrace_oneliners.txt sowie einiger zusätzlicher "relevanter Variablennamen" -Tipps unter /programming//a/10465606/179583 überprüft . und scheint unter einigen grundlegenden Tests zu funktionieren. Nun, wenn nur mein Prozess unerwartet wieder sterben würde! ;-)

natevw
quelle
1
Für andere Plattformen gibt es stracewelche, die den gleichen Zweck erfüllen, wenn ich mich nicht irre. Ich konnte die von einem Prozess empfangenen Signale anhand dieses Artikels verfolgen .
Aaron
-2

Nein, Sie können nicht wissen, wer ein Signal sendet.

sntg
quelle
2
Das ist nicht unbedingt der Fall.
Larsks