2012-01-11 16 views
6

मैं प्रक्रिया entry, exit पर कब्जा करना चाहता हूं और पूरे सिस्टम (शायद एक डेमॉन प्रक्रिया) के लिए लॉग बनाए रखना चाहता हूं।प्रक्रिया प्रविष्टि/बाहर निकलने के लिए कोई संभावित समाधान?

एक दृष्टिकोण /proc फ़ाइल सिस्टम समय-समय पर पढ़ने और सूची को बनाए रखना था, क्योंकि मुझे /proc के लिए पंजीकरण करने की संभावना दिखाई नहीं दे रही है। साथ ही, डेस्कटॉप अनुप्रयोगों के लिए, मुझे dbus की सहायता मिल सकती है, और जब भी क्लाइंट डेस्कटॉप पर पंजीकृत होता है, तो मैं कैप्चर कर सकता हूं।

लेकिन गैर डेस्कटॉप अनुप्रयोगों के लिए, मुझे नहीं पता कि समय-समय पर /proc पढ़ने से अलग कैसे जाना है।

कृपया सुझाव प्रदान करें।

+0

आपको शायद कर्नेल मॉड्यूल लिखना होगा; मुझे नहीं लगता कि आप इसे उपयोगकर्ता स्पेस से सटीक रूप से कर सकते हैं। –

+0

संबंधित: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011- सितंबर /003367.html –

+0

आप ptrace (http://en.wikipedia.org/wiki/Ptrace) का उपयोग करने का प्रयास कर सकते हैं जो आपको अनुमति देगा जीडीबी की तरह जाल syscalls कर सकते हैं। आपको रूट के रूप में अपना प्रोग्राम चलाने की आवश्यकता होगी। मुझे नहीं पता कि ** पूरे ** सिस्टम के लिए कितना 'भारी' दृष्टिकोण होगा। –

उत्तर

1

यदि आप वास्तव में सभी प्रक्रिया प्रविष्टि और निकास लॉग करना चाहते हैं, तो आपको कर्नेल में हुक करने की आवश्यकता होगी। जिसका अर्थ है कर्नेल को संशोधित करना या कम से कम कर्नेल मॉड्यूल लिखना। "लिनक्स सुरक्षा मॉड्यूल" निश्चित रूप से प्रवेश में हुकिंग की अनुमति देगा, लेकिन मुझे यकीन नहीं है कि बाहर निकलने के लिए संभव है या नहीं।

यदि आप कभी-कभी बाहर निकलने के साथ रह सकते हैं (यदि बाइनरी स्थिर रूप से जुड़ा हुआ है या किसी भी तरह से आपकी पर्यावरण सेटिंग से बचाता है), लाइब्रेरी को प्रीलोड करने का एक आसान विकल्प है।

लिनक्स गतिशील लिंकर में एक सुविधा है, यदि पर्यावरण परिवर्तनीय LD_PRELOAD(see this question) साझा लाइब्रेरी का नाम है, तो यह उस लाइब्रेरी को प्रारंभिक प्रक्रिया में बल-लोड करेगा। तो आप एक लाइब्रेरी बना सकते हैं, जो इसके स्थिर प्रारंभ में डेमॉन को बताएगा कि एक प्रक्रिया शुरू हो गई है और ऐसा करें ताकि प्रक्रिया समाप्त होने पर प्रक्रिया पता चल सके।

सी ++ में कन्स्ट्रक्टर के साथ वैश्विक वस्तु बनाकर स्टेटिक प्रारंभिकता सबसे आसान है। डायनामिक लिंकर यह सुनिश्चित करेगा कि लाइब्रेरी लोड होने पर स्थिर कन्स्ट्रक्टर चलाएगा।

यह प्रक्रिया समाप्त होने पर संबंधित विनाशक को चलाने की भी कोशिश करेगा, ताकि आप आसानी से निर्माता और विनाशक में प्रक्रिया को लॉग कर सकें। लेकिन अगर प्रक्रिया 9 सिग्नल 9 (किल) की प्रक्रिया से मर जाती है तो यह काम नहीं करेगा और मुझे यकीन नहीं है कि अन्य सिग्नल क्या करेंगे।

तो इसके बजाय आपको एक डिमन होना चाहिए और कन्स्ट्रक्टर में प्रक्रिया शुरू करने के बारे में डिमन को बताएं और सुनिश्चित करें कि यह प्रक्रिया कब होगी जब प्रक्रिया स्वयं से निकलती है। एक विकल्प जो दिमाग में आता है वह डिमन को यूनिक्स-डोमेन सॉकेट खोल रहा है और इसे खोल देता है। जब प्रक्रिया मर जाती है और डिमन नोटिस करेगा तो कर्नेल इसे बंद कर देगा। आपको सॉकेट के लिए उच्च वर्णक संख्या का उपयोग करने के लिए कुछ सावधानी बरतनी चाहिए, क्योंकि कुछ प्रक्रियाएं मान सकती हैं कि कम वर्णक संख्या (3, 4, 5) निःशुल्क हैं और dup2 उनके लिए हैं। और डिमन के लिए और सामान्य रूप से सिस्टम के लिए अधिक दायरलेखकों की अनुमति देना न भूलें।

ध्यान दें कि बस/proc फाइल सिस्टम को मतदान करने से आप शायद बड़ी संख्या में प्रक्रियाओं को याद करेंगे जो केवल विभाजित दूसरे के लिए रहते हैं। यूनिक्स पर उनमें से कई वास्तव में हैं।

2

शायद एक सुपरप्रोसेस बनाने के लिए सुरक्षित तरीका है जो माता-पिता और फोर्क बच्चों के रूप में कार्य करता है। हर बार जब एक बाल प्रक्रिया बंद हो जाती है तो पिता इसे पा सकते हैं। यह सिर्फ एक विचार है कि वास्तुकला आपकी आवश्यकताओं के अनुरूप है।

बेशक, यदि पैरेंट प्रक्रिया निष्पादन योग्य नहीं है तो आपको कर्नेल पर जाना होगा।

3

आपने उल्लेख किया/proc, तो मुझे लगता है कि आपको वहां एक लिनक्स सिस्टम मिल गया है।

एसीटी पैकेज स्थापित करें। Lastcomm कमांड सभी प्रक्रियाओं को निष्पादित करता है और उनकी रन अवधि, जो आप पूछ रहे हैं। अपना प्रोग्राम "पूंछ"/var/log/account/pacct (आपको एक्ट (5)) और वॉयला में वर्णित इसकी संरचना मिल जाएगी। हालांकि, यह समाप्ति पर सिर्फ अधिसूचना है। स्टार्ट-अप का पता लगाने के लिए, आपको समय-समय पर सिस्टम प्रक्रिया तालिका के माध्यम से खोदने की आवश्यकता होगी, अगर आपको वास्तव में इसकी आवश्यकता है।

+0

+1 इस तथ्य के लिए कि एक्ट का उल्लेख यहां किया गया है। यह प्रोसेस एकाउंटिंग (http://www.faqs.org/docs/Linux-mini/Process-Accounting.html) नामक एक कार्यान्वयन है। – cateof

0

यहां समाधान का एक रूपरेखा है जिसके साथ हम आए थे।

हमने एक प्रोग्राम बनाया है जो सिस्टम को मॉनिटर करने में सक्षम सभी संभावित अनुप्रयोगों की कॉन्फ़िगरेशन फ़ाइल पढ़ता है। यह प्रोग्राम कॉन्फ़िगरेशन फ़ाइल को पढ़ता है और एक कमांड लाइन इंटरफ़ेस के माध्यम से आप प्रोग्राम्स को प्रारंभ या बंद करने में सक्षम थे। प्रोग्राम ने साझा की गई मेमोरी में एक टेबल संग्रहीत किया जो अनुप्रयोगों को चलने या नहीं के रूप में चिह्नित करता है। एक इंटरफ़ेस जिसे कोई भी एक्सेस कर सकता है, इन कार्यक्रमों की स्थिति प्राप्त कर सकता है। इस कार्यक्रम में एक अलार्म सिस्टम भी था जो या तो ईमेल/पेज या अलार्म सेट कर सकता था।

इस समाधान को कर्नेल में किसी भी बदलाव की आवश्यकता नहीं है और इसलिए यह एक कम दर्दनाक समाधान है।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे