जब Linux पर चलने वाले प्रोग्राम ऑपरेटिंग सिस्टम द्वारा प्रबंधित संसाधनों का उपयोग करना चाहते हैं (फ़ाइलें पढ़ना, प्रक्रियाएँ बनाना, आदि), तो वे OS को सिस्टम कॉल करते हैं। सिस्टम कॉल कर्नेल स्तर पर काम करते हैं और कॉलिंग प्रोग्राम पर नियंत्रण छोड़ते हुए आवश्यक संचालन करते हैं। स्ट्रेस टूल लिनक्स पर इन सिस्टम कॉल्स को ट्रेस करने की क्षमता प्रदान करता है।
स्ट्रेस कमांड का विशिष्ट उपयोग
किसी एप्लिकेशन के लिए सिस्टम कॉल की निगरानी के लिए, बस कमांड को इनवाइट करें स्ट्रेस निम्नलिखित प्रारूप में:
स्ट्रेस एलएस / टीएमपी
हालांकि, अक्सर ऐसी प्रक्रियाएं होती हैं जो बहुत पहले शुरू होती हैं और पृष्ठभूमि में काम करना जारी रखती हैं। किसी भी समस्या के कारण, आप ऐसी प्रक्रियाओं से जुड़ी अतिरिक्त जानकारी एकत्र करना चाह सकते हैं। आप संलग्न कर सकते हैं स्ट्रेस प्रक्रिया की प्रक्रिया आईडी देकर किसी भी चल रहे आवेदन को -पी पैरामीटर:
स्ट्रेस-पी 2759
आउटपुट:
एक ऐप के धागे और कांटे का ट्रैक रखें
स्ट्रेस के साथ, आप उन सभी थ्रेड्स और अन्य चाइल्ड प्रोसेस की जांच कर सकते हैं जो एप्लिकेशन का एक कांटा हैं -एफ झंडा।
स्ट्रेस-एफ-पी 2759
आउटपुट:
स्ट्रेस के साथ कुछ सिस्टम कॉल की जाँच करें
डिफ़ॉल्ट स्ट्रेस आउटपुट कई बार अनुसरण करने के लिए काफी भीड़भाड़ वाला हो सकता है। यदि आप केवल कुछ सिस्टम कॉल को ट्रैक करना चाहते हैं, तो आप इसके साथ ऐसा कर सकते हैं -इ पैरामीटर:
स्ट्रेस-एफ-ई ट्रेस = खोलें, लिखें, बंद करें, कनेक्ट करें,चुनते हैं -पी 19770
फ़ाइल संचालन से संबंधित केवल सिस्टम कॉल का पता लगाने के लिए, उपयोग करें -ई ट्रेस = फ़ाइल:
स्ट्रेस -ई ट्रेस = फ़ाइल -पी 197770
केवल नेटवर्क-संबंधित सिस्टम कॉल को फ़िल्टर करने के लिए, निर्दिष्ट करें -ई ट्रेस = नेटवर्क कमांड में:
स्ट्रेस -ई ट्रेस = नेटवर्क -पी 197770
सेकंड में समय की जानकारी प्राप्त करें
सिस्टम कॉल को आउटपुट करते समय, आप इसका उपयोग कर सकते हैं -टी सेकंड में सटीकता के साथ समय की जानकारी प्राप्त करने के लिए पैरामीटर। अधिकांश समय सटीकता आपकी आवश्यकताओं के लिए पर्याप्त नहीं होगी। ऐसी स्थितियों में, आप उपयोग कर सकते हैं -टीटीई माइक्रोसेकंड परिशुद्धता के साथ समय की जानकारी प्राप्त करने के लिए पैरामीटर:
स्ट्रेस -टीटी एलएस / टीएमपी
सिस्टम कॉल के बारे में आंकड़े एकत्र करें
उसके साथ -सी पैरामीटर, आप जब तक चाहें सिस्टम कॉल के बारे में आंकड़े एकत्र कर सकते हैं:
स्ट्रेस-एफ-सी-पी 197770
लॉग को एक फ़ाइल में सहेजें
यदि आप लंबे समय तक स्ट्रेस चलाते हैं और बाद में परिणामी लॉग की अधिक विस्तार से जांच करना चाहते हैं, तो आपको लॉग को सहेजना होगा। उसके साथ -ओ पैरामीटर आप उस फ़ाइल को निर्दिष्ट कर सकते हैं जिसमें स्ट्रेस को लॉग सहेजना चाहिए:
स्ट्रेस -f -o /tmp/strace.log -e ट्रेस = फ़ाइल ls /tmp
ptrace अवरोधन प्रक्रिया
prctl सिस्टम कॉल का उपयोग करते हुए, Linux के अंतर्गत कोई भी एप्लिकेशन ptrace का उपयोग करके गैर-रूट उपयोगकर्ताओं द्वारा स्वयं को नियंत्रित होने से रोक सकता है। यदि एप्लिकेशन साफ़ करता है PR_SET_DUMPABLE prctl के माध्यम से स्वयं के लिए ध्वज, रूट के अलावा अन्य उपयोगकर्ता इस एप्लिकेशन को ptrace से नियंत्रित करने में सक्षम नहीं होंगे, भले ही उन्हें एप्लिकेशन को सिग्नल करने का अधिकार हो।
इस सुविधा के सबसे विशिष्ट उपयोगों में से एक OpenSSH प्रमाणीकरण एजेंट सॉफ़्टवेयर में देखा जाता है। इस प्रकार, किसी अन्य एप्लिकेशन द्वारा एप्लिकेशन का नियंत्रण ptrace उपयोगकर्ता प्रमाणीकरण पर रोका जाता है।
ptrace और सुरक्षा
पारंपरिक Linux प्रक्रिया मॉडल में सेट की गई ptrace सुविधा के कारण, आपके सिस्टम पर आपके उपयोगकर्ता के साथ चलने वाला कोई भी सॉफ़्टवेयर उसमें दुर्भावनापूर्ण कोड डालने का अधिकार रखता है। सबसे सरल xterm टूल से उन्नत वेब ब्राउज़र अनुप्रयोग, ऐसे मैलवेयर आपके अन्य सभी चल रहे एप्लिकेशन को नियंत्रित कर सकते हैं—पट्रेस सिस्टम कॉल के लिए धन्यवाद—और आपके ध्यान दिए बिना महत्वपूर्ण जानकारी की प्रतिलिपि बना सकते हैं।
इस स्थिति के जवाब में, जिसके बारे में कई उपयोगकर्ताओं को जानकारी नहीं है, सुरक्षा मॉड्यूल के साथ एक सुरक्षा तंत्र विकसित किया गया है जिसे कहा जाता है लिनक्स कर्नेल में यम.
आप ptrace सिस्टम कॉल की प्रतिक्रिया को के माध्यम से नियंत्रित कर सकते हैं /proc/sys/kernel/yama/ptrace_scope फ़ाइल। डिफ़ॉल्ट रूप से, यह फ़ाइल 0 का मान लिखती है।
निम्नलिखित मान स्वीकार्य हैं:
मूल्य | अर्थ |
0 | पारंपरिक व्यवहार: सभी एप्लिकेशन जिनके पास का अधिकार है ptrace जाँच की जा सकती है। |
1 | प्रतिबंधित ptrace: केवल आवेदन के प्रत्यक्ष अभिभावक या आवेदन द्वारा अनुमत डिबग अनुप्रयोगों के साथ PR_SET_PTRACER विकल्प नियंत्रण है। इस प्रकार, के उपयोग जीडीबी प्रोग्राम_नाम और स्ट्रेस प्रोग्राम_नाम काम करना जारी रखेगा, लेकिन आप बाद में चल रहे एप्लिकेशन को अटैच नहीं कर पाएंगे। |
2 | सिस्टम एडमिनिस्ट्रेटर के लिए ट्रैस: केवल परिभाषित के साथ आवेदन CAP_SYS_PTRACE संपत्ति या बाल प्रक्रियाएं जो परिभाषित करती हैं PTRACE_TRACEME के साथ विकल्प पीआरसीटीएल नियंत्रित किया जा सकता है। |
3 | पूरी तरह से अक्षम: नहीं ptrace किसी भी परिस्थिति में अनुमति है। यदि यह गुण एक बार परिभाषित किया गया है, तो आप इसे रनटाइम पर फिर से नहीं बदल सकते। |
कई डेवलपर्स यह नहीं जानते हैं कि एप्लिकेशन रूट उपयोगकर्ता को छोड़कर, prctl के माध्यम से स्वयं ptrace को अक्षम कर सकते हैं। हालांकि सुरक्षा संबंधी सॉफ्टवेयर जैसे कि ओपनएसएसएच एजेंट इन ऑपरेशनों को करता है, सिस्टम पर चल रहे सभी सॉफ्टवेयर से समान व्यवहार की अपेक्षा करना सही नहीं होगा।
हाल ही में, कुछ लिनक्स वितरण का डिफ़ॉल्ट मान सेट करना शुरू कर दिया है ptrace_scope फ़ाइल, ऊपर वर्णित, to 1. इस प्रकार, ptrace संचालन प्रतिबंधित होने के साथ, पूरे सिस्टम में एक सुरक्षित कार्य वातावरण प्रदान किया जाता है।
एक उदाहरण स्ट्रेस का उपयोग करना
नाम के साथ नीचे नमूना आवेदन पंजीकृत करें मिनिस्ट्रेस.सी. फिर आप इसे निम्न आदेश के साथ संकलित कर सकते हैं:
जीसीसी-ओमिनिस्ट्रेसमिनिस्ट्रेस।सी
कोड:
#शामिल करना <sys/ptrace.h>
#शामिल करना <sys/reg.h>
#शामिल करना <sys/प्रतीक्षा.एच>
#शामिल करना <sys/types.h>
#शामिल करना <unistd.h>
#शामिल करना <stdlib.h>
#शामिल करना <stdio.h>
#शामिल करना <त्रुटिपूर्ण>
#शामिल करना <string.h>
पूर्णांकप्रतीक्षा_for_syscall(pid_t बच्चा)
{
पूर्णांक स्थिति;
जबकि (1) {
ptrace (PTRACE_SYSCALL, बच्चा, 0, 0);
वेटपिड (बच्चा, &स्थिति, 0);
अगर (WIFSTOPPED (स्थिति) && WSTOPSIG (स्थिति) & 0x80)
वापसी0;
अगर (पत्नी (स्थिति))
वापसी1;
}
}पूर्णांकdo_child(पूर्णांक आर्गसी, चारो **आर्गव)
{
चारो *आर्ग्स [argc+1];
memcpy (args, argv, argc * sizeof (चारो*));
args [argc] = व्यर्थ;
ptrace (PTRACE_TRACEME);
मारना(गेटपिड (), सिगस्टॉप);
वापसी execvp (तर्क [0], आर्ग);
}पूर्णांकdo_trace(pid_t बच्चा)
{
पूर्णांक स्थिति, syscall, retval;
वेटपिड (बच्चा, &स्थिति, 0);
ptrace (PTRACE_SETOPTIONS, बच्चा, 0, PTRACE_O_TRACESYSGOOD);
जबकि(1) {
अगर (प्रतीक्षा_for_syscall (बच्चा)!= 0) टूटना;syscall = ptrace (PTRACE_PEEKUSER, बच्चा, आकार (लंबा)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", सिस्कल);अगर (प्रतीक्षा_for_syscall (बच्चा)!= 0) टूटना;
रिटवल = ptrace (PTRACE_PEEKUSER, बच्चा, आकार (लंबा)*आरएएक्स);
fprintf (stderr, "%डी
", रिटवल);
}
वापसी0;
}
पूर्णांकमुख्य(पूर्णांक आर्गसी, चारो **आर्गव)
{
अगर (आर्गसी < 2) {
fprintf (stderr, "उपयोग: %s प्रोग args
", एआरजीवी [0]);
बाहर निकलना(1);
}
pid_t बच्चा = कांटा ();
अगर (बच्चा == 0) {
वापसी do_child (argc-1, एआरजीवी+1);
} वरना {
वापसी do_trace (बच्चा);
}
}
एप्लिकेशन को संकलित करने के बाद, आप किसी भी कमांड को चला सकते हैं मिनिस्ट्रेस और आउटपुट की जांच करें:
आप कई उद्देश्यों के लिए स्ट्रेस का उपयोग कर सकते हैं
स्ट्रेस प्रोग्राम में बग ढूंढने में मदद कर सकता है जो अनावश्यक रूप से सिस्टम संसाधनों का उपयोग करते हैं। इसी तरह, ऑपरेटिंग सिस्टम संसाधनों का उपयोग करते समय एक प्रोग्राम जो विशेषता प्रदर्शित करता है, उसे भी स्ट्रेस के साथ प्रकट किया जा सकता है।
चूंकि स्ट्रेस सीधे सिस्टम कॉल को सुनता है, यह रनटाइम डायनेमिक्स को प्रकट कर सकता है, भले ही प्रोग्राम का कोड खुला / बंद हो। यह अंदाजा लगाना संभव है कि स्ट्रेस का उपयोग शुरू करने पर प्रोग्राम त्रुटि क्यों फेंकते हैं।
इसी तरह, स्ट्रेस आपको यह समझने में मदद करता है कि कोई प्रोग्राम अप्रत्याशित रूप से क्यों समाप्त हो जाता है। इसलिए, लिनक्स कर्नेल विकास और सिस्टम प्रशासन में स्ट्रेस से परिचित होना बहुत महत्वपूर्ण है।
स्क्रैच से लिनक्स के साथ अपना खुद का ऑपरेटिंग सिस्टम बनाएं [लिनक्स]
आगे पढ़िए
संबंधित विषय
- लिनक्स
- लिनक्स कमांड
- लिनक्स कर्नेल
लेखक के बारे में

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