Apakah ada cara untuk mengetahui asal usul sinyal yang dikirim di Red Hat Enterprise Linux 5 (SIGTERM, dll.)? Saya secara teratur menjebak suatu TERM dalam suatu aplikasi dan saya tidak tahu dari mana asalnya.
Apakah ada cara untuk mengetahui asal usul sinyal yang dikirim di Red Hat Enterprise Linux 5 (SIGTERM, dll.)? Saya secara teratur menjebak suatu TERM dalam suatu aplikasi dan saya tidak tahu dari mana asalnya.
Jawaban:
Halaman manual untuk sigaction(2)
menunjukkan bahwa PID pengirim sinyal tersedia dalam struktur siginfo_t yang diteruskan ke pengendali sinyal Anda. Ini jelas mengharuskan Anda menggunakan sigaction ().
Dari halaman manual:
Struktur sigaction didefinisikan sebagai sesuatu seperti:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Dan siginfo_t
strukturnya terlihat seperti ini:
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 */
}
Pada platform dengan DTrace (OS X, Solaris, ... others?) Anda dapat menggunakannya dengan probe seperti ini untuk mencatat informasi yang Anda cari:
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); }'
Saya mendasarkan ini pada skrip yang ditemukan di bagian bawah http://www.brendangregg.com/DTrace/dtrace_oneliners.txt plus beberapa tips "nama variabel relevan" tambahan di /programming//a/10465606/179583 , dan tampaknya bekerja di bawah beberapa pengujian dasar. Sekarang, andai saja proses saya tiba-tiba mati lagi! ;-)
strace
yang melayani tujuan yang sama jika saya tidak salah. Saya dapat melacak sinyal yang diterima oleh suatu proses dengan mengikuti artikel ini .