Cách tìm ra nguồn tín hiệu POSIX


13

Có cách nào để tìm ra nguồn gốc của tín hiệu được gửi trong Red Hat Enterprise Linux 5 (SIGTERM, v.v.) không? Tôi thường xuyên đặt bẫy HẠN trong một ứng dụng và tôi không biết nó đến từ đâu.

Câu trả lời:


14

Trang hướng dẫn cho sigaction(2)thấy rằng PID của người gửi tín hiệu có sẵn trong cấu trúc siginfo_t được chuyển đến bộ xử lý tín hiệu của bạn. Điều này rõ ràng yêu cầu bạn sử dụng sigaction ().

Từ trang người đàn ông:

Cấu trúc sigaction được định nghĩa là một cái gì đó như:

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

siginfo_tcấu trúc trông như thế này:

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

Cảm ơn câu trả lời, không mong đợi quá nhiều chi tiết. Tôi đang sử dụng trình bao bọc dịch vụ Java và khi được đặt thành "gỡ lỗi", nó sẽ in một cái gì đó như thế này: Tín hiệu bị kẹt. Chi tiết: số tín hiệu = 15 (SIGTERM), nguồn = "giết, sigsend hoặc tăng" tín hiệu được tạo bởi PID: 2194 (Phiên PID: 2164), UID: 1002 (alfresco) Tôi chỉ tìm thấy sau khi tìm kiếm "si_pid" và tìm thấy nguồn bao bọc unix c nguồn. :-)
dùng27451

1

Trên các nền tảng có DTrace (OS X, Solaris, những người khác?) Bạn có thể sử dụng nó với một đầu dò như thế này để ghi lại thông tin bạn đang theo dõi:

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

Tôi dựa trên tập lệnh được tìm thấy ở dưới cùng của http://www.oustndangregg.com/DTrace/dtrace_oneliners.txt cùng với một số mẹo "tên biến có liên quan" bổ sung tại /programming//a/10465606/179583 , và dường như làm việc theo một số thử nghiệm cơ bản. Bây giờ, nếu chỉ có quá trình của tôi sẽ bất ngờ chết một lần nữa! ;-)


1
Đối với các nền tảng khác, có stracecác mục đích tương tự nếu tôi không nhầm. Tôi đã có thể theo dõi các tín hiệu nhận được bởi một quá trình bằng cách theo dõi bài viết này .
Aaron

-2

Không, bạn không thể biết ai đang gửi tín hiệu.


2
Đó không nhất thiết phải là trường hợp.
larsks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.