Existe-t-il un moyen de découvrir l'origine d'un signal envoyé dans Red Hat Enterprise Linux 5 (SIGTERM, etc.)? Je piège régulièrement un TERM dans une application et je n'ai aucune idée d'où il vient.
13
La page de manuel pour sigaction(2)
suggère que le PID de l'expéditeur du signal est disponible dans la structure siginfo_t transmise à votre gestionnaire de signal. Cela nécessite évidemment d'utiliser sigaction ().
Depuis la page de manuel:
La structure de sigaction est définie comme quelque chose comme:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Et la siginfo_t
structure ressemble à ceci:
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 */
}
Sur les plates-formes avec DTrace (OS X, Solaris,… autres?), Vous pouvez l'utiliser avec une sonde comme celle-ci pour enregistrer les informations que vous recherchez:
J'ai basé cela sur un script trouvé au bas de http://www.brendangregg.com/DTrace/dtrace_oneliners.txt ainsi que quelques conseils supplémentaires sur les "noms de variable pertinents" sur /programming//a/10465606/179583 , et semble fonctionner sous certains tests de base. Maintenant, si seulement mon processus mourait de façon inattendue! ;-)
la source
strace
ce qui sert le même but si je ne me trompe pas. J'ai pu retracer les signaux reçus par un processus en suivant cet article .Vous pouvez tracer des signaux à l'aide de systemtap. Voici un exemple simple
https://sourceware.org/systemtap/examples/lwtools/killsnoop-nd.stp
la source
Non, vous ne pouvez pas savoir qui envoie un signal.
la source