strace गाइड: Linux सिस्टम कॉल ट्रेसिंग और डिबगिंग

परिचय और कार्यप्रणाली

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

strace इंस्टॉलेशन और बुनियादी सिस्टम कॉल मॉनिटरिंग

सिस्टम पर इस डायग्नोस्टिक टूल का उपयोग शुरू करने के लिए सबसे पहले उबंटू रिपॉजिटरी इंडेक्स को रीफ्रेश करके strace पैकेज को डिप्लॉय किया जाता है।

apt-get update -qq && apt-get install -y strace

परीक्षण और ट्रेसिंग को नियंत्रित वातावरण में निष्पादित करने के लिए /tmp डायरेक्टरी में एक साधारण टेक्स्ट फ़ाइल तैयार की जाती है।

echo ‘Linux strace test content’ > /tmp/testfile.txt

strace यूटिलिटी यूज़र-स्पेस प्रोग्राम्स और कर्नेल के बीच आदान-प्रदान होने वाले सिस्टम कॉल्स और सिग्नल्स को इंटरसेप्ट करके रीयल-टाइम में प्रदर्शित करती है। उदाहरण के लिए, जब cat कमांड को strace के तहत चलाया जाता है, तो फ़ाइल डिस्क्रिप्टर खोलने (openat), डेटा बफर में लोड करने (read), स्टैंडर्ड आउटपुट पर भेजने (write) तथा संसाधन मुक्त करने (close) का पूरा चक्र स्क्रीन पर दिखाई देता है।

⚙️ [महत्वपूर्ण कमांड विकल्प]

-c : सभी निष्पादित कॉल्स की कुल संख्या, लगने वाला समय और विफलताओं (त्रुटियों) का संपूर्ण सांख्यिकीय सारांश प्रस्तुत करता है।
-e : केवल वांछित सिस्टम कॉल्स या विशिष्ट इवेंट श्रेणियों को फ़िल्टर करके प्रदर्शित करता है।
-o : टर्मिनल कंसोल को अव्यवस्थित किए बिना ट्रेस आउटपुट को किसी निर्दिष्ट लॉग फ़ाइल में सुरक्षित रखता है।
-p : पहले से चल रही बैकग्राउंड या डेमन प्रोसेस की PID से जुड़कर लाइव इंटरैक्शन को ट्रैक करता है।
-T : प्रत्येक सिस्टम कॉल के निष्पादन में व्यतीत हुए सटीक समय को लाइन के अंत में जोड़ता है।
-tt : माइक्रोसेकंड की सटीकता के साथ हर इवेंट का सिस्टम टाइमस्टैम्प रिकॉर्ड करता है।
-s : कॉल्स में पास किए जाने वाले स्ट्रिंग आर्ग्युमेंट्स की अधिकतम प्रिंट लंबाई (बाइट्स में) तय करता है।

strace cat /tmp/testfile.txt

चयनात्मक ट्रेसिंग: -e trace विकल्प से आउटपुट फ़िल्टर करना

जब कोई कमांड निष्पादित होती है, तो सैकड़ों आंतरिक सिस्टम कॉल्स ट्रिगर होते हैं जो विश्लेषण को जटिल बना सकते हैं। strace -e trace=openat,read,write,close cat /tmp/testfile.txt कमांड का उपयोग करके शोर को समाप्त किया जाता है और केवल चयनित फ़ाइल I/O कॉल्स पर ध्यान केंद्रित किया जाता है। अल्पविराम (comma) से अलग करके अपनी पसंद के कॉल्स निर्दिष्ट करने से डिबगिंग आउटपुट बेहद साफ़ और प्रासंगिक हो जाता है।

strace -e trace=openat,read,write,close cat /tmp/testfile.txt

प्रत्येक कॉल का नाम अलग से लिखने के बजाय पूर्वनिर्धारित श्रेणियों का उपयोग भी किया जा सकता है। उदाहरण स्वरूप, strace -e trace=file ls -l /tmp/testfile.txt कमांड में file क्लास का चयन करने से पाथ रिज़ॉल्यूशन, एक्सेस परमिशन, इनोड स्टेटस और मेटाडेटा जांच से संबंधित सभी ऑपरेशंस एक साथ मॉनिटर हो जाते हैं।

strace -e trace=file ls -l /tmp/testfile.txt

परफ़ॉर्मेंस प्रोफाइलिंग और बॉटलनेक विश्लेषण: -c विकल्प

विशाल डायरेक्टरी स्ट्रक्चर जैसे /usr/bin को स्कैन करते समय कर्नेल स्तर पर क्या घटित होता है, इसे समझने के लिए -c फ्लैग अत्यंत उपयोगी है। strace -c ls -la /usr/bin > /dev/null के ज़रिए सामान्य आउटपुट को म्यूट कर दिया जाता है, जिससे प्रक्रिया समाप्त होते ही समय व्यय का प्रतिशत, कुल माइक्रोसेकंड, कॉल्स की आवृत्ति और त्रुटि गणना की स्पष्ट तालिका सामने आ जाती है।

strace -c ls -la /usr/bin > /dev/null

सर्च या डिस्क इंटेंसिव ऑपरेशंस में भी यही पद्धति कारगर साबित होती है। strace -c grep -rn 'root' /etc/passwd > /dev/null कमांड चलाने पर यह स्पष्ट दिखाई देता है कि फ़ाइल खोलने या बफ़र रीड करने में सिस्टम का कितना प्रतिशत समय लगा। इससे हार्डवेयर या I/O बॉटलनेक की पहचान तुरंत हो जाती है।

strace -c grep -rn ‘root’ /etc/passwd > /dev/null

रनिंग प्रोसेस अटैचमेंट और लॉग फ़ाइल रिकॉर्डिंग: -p व -o विकल्प

लाइव डीबगिंग परिदृश्यों का अनुकरण करने हेतु एक स्वतंत्र बैकग्राउंड प्रोसेस शुरू करने के लिए sleep 100 & कमांड दी जाती है।

sleep 100 &

हाल ही में निष्पादित बैकग्राउंड जॉब का प्रोसेस आईडी हासिल करके उसे ऑटोमेशन वेरिएबल में सुरक्षित रखने के लिए TARGET_PID=$! सिंटैक्स लागू किया जाता है।

TARGET_PID=$!

strace -p $TARGET_PID -o /tmp/strace_output.log -t & कमांड के ज़रिए लक्षित PID से जुड़कर बैकग्राउंड में ट्रेसिंग शुरू की जाती है, जिसमें प्रत्येक एंट्री पर सेकंड-स्तरीय टाइमस्टैम्प दर्ज होता है। यह विधि प्रोडक्शन सर्वर पर बिना सर्विस रोके या टर्मिनल ब्लॉक किए साइलेंट लॉगिंग और पोस्ट-मॉर्टम विश्लेषण के लिए आदर्श है।

strace -p $TARGET_PID -o /tmp/strace_output.log -t &

ट्रेसर और टारगेट प्रोसेस के बीच सुरक्षित हुक स्थापित होने की पुष्टि के लिए sleep 1 द्वारा एक सेकंड का विराम दिया जाता है।

sleep 1

विश्लेषण सत्र समाप्त करने तथा बैकग्राउंड में सक्रिय डमी टास्क को टर्मिनेट करने के लिए kill $TARGET_PID कमांड भेजी जाती है।

kill $TARGET_PID

रिकॉर्ड की गई डायग्नोस्टिक लॉग फ़ाइल के शुरुआती हिस्से की जांच head -n 20 /tmp/strace_output.log से की जाती है। इसमें प्रोसेस द्वारा SIGTERM सिग्नल प्राप्त करने तथा क्लोजर रूटीन पूरा होने की पूरी शृंखला साफ तौर पर देखी जा सकती है।

head -n 20 /tmp/strace_output.log

इस गाइड में हमने जाना कि लिनक्स वातावरण में छिपे हुए इश्यूज़ को उजागर करने के लिए strace किस प्रकार एक अचूक हथियार साबित होता है। जब भी कोई ऐप्लिकेशन अस्पष्ट एरर दे या हैंग हो जाए, तो कोडबेस में भटके बिना सीधे कर्नल कॉल्स की पड़ताल करें और समस्या की जड़ तक पहुँचें।