POSIX सिग्नल का स्रोत कैसे पता करें


12

क्या Red Hat Enterprise Linux 5 (SIGTERM आदि) में भेजे गए सिग्नल की उत्पत्ति का पता लगाने का कोई तरीका है? मैं नियमित रूप से एक एप्लिकेशन में TERM को फंसा रहा हूं और मुझे पता नहीं है कि यह कहां से आ रहा है।

जवाबों:


13

इसके लिए मैन पेज sigaction(2)बताता है कि सिग्नल भेजने वाले का PID आपके सिग्नल हैंडलर को दिए गए siginfo_t संरचना में उपलब्ध है। यह स्पष्ट रूप से आवश्यक है कि आप sigaction () का उपयोग करें।

मैन पेज से:

सिगनेशन स्ट्रक्चर को कुछ इस तरह से परिभाषित किया गया है:

   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_tसंरचना इस तरह दिखती है:

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

उत्तर के लिए धन्यवाद, इतने सारे विवरणों की अपेक्षा नहीं की। मैं जावा सेवा आवरण का उपयोग कर रहा हूं, और जब "डीबग" पर सेट किया जाएगा तो यह कुछ इस तरह प्रिंट करेगा: सिग्नल फंसा हुआ। विवरण: सिग्नल नंबर = 15 (SIGTERM), स्रोत = "PID: 2194 (सत्र PID: 2164), UID: 1002 (alfresco) द्वारा उत्पन्न" किल, sigsend या उठाना "सिग्नल मैं केवल" si_pid "और ढूंढने के बाद googling के बाद मिला रैपर यूनिक्स सी स्रोत। :-)
user27451

1

DTrace (OS X, Solaris,…। दूसरों) के साथ प्लेटफ़ॉर्म पर आप इसे एक जांच के साथ इस तरह इस्तेमाल कर सकते हैं जैसे कि आपके द्वारा दी गई जानकारी को लॉग इन करने के लिए:

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

मैं http://www.brendangregg.com/DTrace/dtrace_oneliners.txt के निचले भाग में पाई गई एक स्क्रिप्ट के आधार पर /programming//a/10465606/178383 पर कुछ अतिरिक्त "प्रासंगिक चर नाम" युक्तियां बताता हूं । और कुछ बुनियादी परीक्षण के तहत काम करने लगता है। अब, अगर केवल मेरी प्रक्रिया अप्रत्याशित रूप से फिर से मर जाएगी! ;-)


1
अन्य प्लेटफार्मों के लिए straceअगर मैं गलत नहीं हूँ तो एक ही उद्देश्य है। मैं इस लेख का अनुसरण करके एक प्रक्रिया द्वारा प्राप्त संकेतों का पता लगाने में सक्षम था ।
हारून


-2

नहीं, आप नहीं जानते कि कौन संकेत भेज रहा है।


2
जरूरी नहीं कि ऐसा ही हो।
लार्क्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.