POSIX sinyalinin kaynağı nasıl bulunur


12

Red Hat Enterprise Linux 5'te (SIGTERM vb.) Gönderilen bir sinyalin kaynağını bulmanın bir yolu var mı? Bir uygulamada düzenli olarak bir TERM yakaladım ve nereden geldiğini bilmiyorum.

Yanıtlar:


13

Man sayfası sigaction(2), sinyal gönderenin PID'sinin sinyal işleyicinize iletilen siginfo_t yapısında bulunduğunu gösterir. Bu açıkça sigaction () kullanmanızı gerektirir.

Man sayfasından:

Sigaction yapısı aşağıdaki gibi tanımlanır:

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

Ve siginfo_tyapı şöyle görünür:

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

Cevabınız için teşekkürler, çok fazla ayrıntı beklemiyordum. Java hizmet sarmalayıcı kullanıyorum ve "hata ayıklama" olarak ayarlandığında böyle bir şey yazdırır: Sinyal sıkışmış. Ayrıntılar: sinyal numarası = 15 (SIGTERM), kaynak = PID: 2194 (Oturum PID: 2164), UID: 1002 (alfresco) tarafından oluşturulan ve yalnızca "si_pid" için arama yaptıktan ve bulduktan sonra buldum "öldür, imzala veya kaldır" sinyali sarıcı unix c kaynağı. :-)
user27451

1

DTrace (OS X, Solaris, ... diğerleri?) Platformlarında, takip ettiğiniz bilgileri kaydetmek için böyle bir probla kullanabilirsiniz:

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

Bunu http://www.brendangregg.com/DTrace/dtrace_oneliners.txt adresinin altında bulunan bir komut dosyasına ve /programming//a/10465606/179583 adresindeki bazı ek "alakalı değişken adları" ipuçlarına dayandım , ve bazı temel testler altında çalışıyor gibi görünüyor. Şimdi, sadece süreçlerim beklenmedik bir şekilde tekrar ölseydi! ;-)


1
Diğer platformlar için strace, yanılmıyorsam aynı amaca hizmet eden var . Bu makaleyi izleyerek bir işlem tarafından alınan sinyalleri izleyebildim .
Aaron


-2

Hayır, kimin sinyal gönderdiğini bilemezsiniz.


2
Bu her zaman böyle değildir.
larsks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.