यदि आप वास्तव में सभी प्रक्रिया प्रविष्टि और निकास लॉग करना चाहते हैं, तो आपको कर्नेल में हुक करने की आवश्यकता होगी। जिसका अर्थ है कर्नेल को संशोधित करना या कम से कम कर्नेल मॉड्यूल लिखना। "लिनक्स सुरक्षा मॉड्यूल" निश्चित रूप से प्रवेश में हुकिंग की अनुमति देगा, लेकिन मुझे यकीन नहीं है कि बाहर निकलने के लिए संभव है या नहीं।
यदि आप कभी-कभी बाहर निकलने के साथ रह सकते हैं (यदि बाइनरी स्थिर रूप से जुड़ा हुआ है या किसी भी तरह से आपकी पर्यावरण सेटिंग से बचाता है), लाइब्रेरी को प्रीलोड करने का एक आसान विकल्प है।
लिनक्स गतिशील लिंकर में एक सुविधा है, यदि पर्यावरण परिवर्तनीय LD_PRELOAD
(see this question) साझा लाइब्रेरी का नाम है, तो यह उस लाइब्रेरी को प्रारंभिक प्रक्रिया में बल-लोड करेगा। तो आप एक लाइब्रेरी बना सकते हैं, जो इसके स्थिर प्रारंभ में डेमॉन को बताएगा कि एक प्रक्रिया शुरू हो गई है और ऐसा करें ताकि प्रक्रिया समाप्त होने पर प्रक्रिया पता चल सके।
सी ++ में कन्स्ट्रक्टर के साथ वैश्विक वस्तु बनाकर स्टेटिक प्रारंभिकता सबसे आसान है। डायनामिक लिंकर यह सुनिश्चित करेगा कि लाइब्रेरी लोड होने पर स्थिर कन्स्ट्रक्टर चलाएगा।
यह प्रक्रिया समाप्त होने पर संबंधित विनाशक को चलाने की भी कोशिश करेगा, ताकि आप आसानी से निर्माता और विनाशक में प्रक्रिया को लॉग कर सकें। लेकिन अगर प्रक्रिया 9 सिग्नल 9 (किल) की प्रक्रिया से मर जाती है तो यह काम नहीं करेगा और मुझे यकीन नहीं है कि अन्य सिग्नल क्या करेंगे।
तो इसके बजाय आपको एक डिमन होना चाहिए और कन्स्ट्रक्टर में प्रक्रिया शुरू करने के बारे में डिमन को बताएं और सुनिश्चित करें कि यह प्रक्रिया कब होगी जब प्रक्रिया स्वयं से निकलती है। एक विकल्प जो दिमाग में आता है वह डिमन को यूनिक्स-डोमेन सॉकेट खोल रहा है और इसे खोल देता है। जब प्रक्रिया मर जाती है और डिमन नोटिस करेगा तो कर्नेल इसे बंद कर देगा। आपको सॉकेट के लिए उच्च वर्णक संख्या का उपयोग करने के लिए कुछ सावधानी बरतनी चाहिए, क्योंकि कुछ प्रक्रियाएं मान सकती हैं कि कम वर्णक संख्या (3, 4, 5) निःशुल्क हैं और dup2
उनके लिए हैं। और डिमन के लिए और सामान्य रूप से सिस्टम के लिए अधिक दायरलेखकों की अनुमति देना न भूलें।
ध्यान दें कि बस/proc फाइल सिस्टम को मतदान करने से आप शायद बड़ी संख्या में प्रक्रियाओं को याद करेंगे जो केवल विभाजित दूसरे के लिए रहते हैं। यूनिक्स पर उनमें से कई वास्तव में हैं।
स्रोत
2012-01-11 14:15:27
आपको शायद कर्नेल मॉड्यूल लिखना होगा; मुझे नहीं लगता कि आप इसे उपयोगकर्ता स्पेस से सटीक रूप से कर सकते हैं। –
संबंधित: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011- सितंबर /003367.html –
आप ptrace (http://en.wikipedia.org/wiki/Ptrace) का उपयोग करने का प्रयास कर सकते हैं जो आपको अनुमति देगा जीडीबी की तरह जाल syscalls कर सकते हैं। आपको रूट के रूप में अपना प्रोग्राम चलाने की आवश्यकता होगी। मुझे नहीं पता कि ** पूरे ** सिस्टम के लिए कितना 'भारी' दृष्टिकोण होगा। –