Cómo encontrar la fuente de una señal POSIX


13

¿Hay alguna manera de averiguar el origen de una señal enviada en Red Hat Enterprise Linux 5 (SIGTERM, etc.)? Regularmente estoy atrapando un TERM en una aplicación y no tengo idea de dónde viene.

Respuestas:


14

La página de manual de sigaction(2)sugiere que el PID del remitente de la señal está disponible en la estructura siginfo_t que se pasa a su controlador de señal. Obviamente, esto requiere que use sigaction ().

Desde la página del manual:

La estructura de seguirction se define como algo así como:

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

Y la siginfo_testructura se ve así:

   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 */
   }

Gracias por la respuesta, no esperaba tantos detalles. Estoy usando el contenedor de servicios de Java, y cuando se establece en "depurar", imprimirá algo como esto: Señal atrapada. Detalles: número de señal = 15 (SIGTERM), fuente = señal "kill, sigsend or raise" generada por PID: 2194 (Session PID: 2164), UID: 1002 (al aire libre) Solo lo descubrí después de buscar en Google "si_pid" y encontrar la fuente de envoltura unix c. :-)
user27451

1

En plataformas con DTrace (OS X, Solaris, ... ¿otras?) Puede usarlo con una sonda como esta para registrar la información que busca:

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

Basé esto en un script que se encuentra en la parte inferior de http://www.brendangregg.com/DTrace/dtrace_oneliners.txt más algunos consejos adicionales de "nombres de variables relevantes" en /programming//a/10465606/179583 , y parece funcionar bajo algunas pruebas básicas. ¡Ahora, si mi proceso muriera inesperadamente de nuevo! ;-)


1
Para otras plataformas, existe straceel mismo propósito si no me equivoco. Pude rastrear las señales recibidas por un proceso siguiendo este artículo .
Aaron

-2

No, no puedes saber quién está enviando una señal.


2
Ese no es necesariamente el caso.
larsks
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.