लिनक्स lsof संपूर्ण गाइड - पोर्ट टकराव से लेकर हटाई गई फ़ाइलों की डिस्क क्षमता खाली करने तक व्यावहारिक मुख्य टिप्स

अवलोकन

लिनक्स सिस्टम संचालन के दौरान होने वाले ‘पोर्ट टकराव’ या ‘फ़ाइल हटाने के बाद भी डिस्क स्पेस खाली न होने’ जैसी समस्याओं को lsof कमांड से तुरंत हल किया जा सकता है। इस लेख में, हम लिनक्स वातावरण में, जहाँ सब कुछ एक फ़ाइल के रूप में प्रबंधित होता है, व्यावहारिक रूप से lsof लागू करने की मुख्य तकनीकों को देखेंगे। पोर्ट ट्रैकिंग से लेकर फ़ाइल लॉक हटाने तक, सिस्टम इंजीनियरों के लिए आवश्यक ट्रबलशूटिंग प्रक्रिया को चरण-दर-चरण जानेंगे।

lsof बुनियादी जांच और विशिष्ट उपयोगकर्ता/प्रक्रिया की खुली फ़ाइलों की जांच

सिस्टम में lsof कमांड स्थापित है या नहीं, यह जांचने के लिए और यदि स्थापित नहीं है तो पैकेज स्थापित करने के लिए command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof) कमांड निष्पादित करें।

command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof)

lsof कमांड का स्थापित संस्करण और बिल्ड जानकारी देखने के लिए lsof -v कमांड निष्पादित करें।
⚙️ [मुख्य विकल्प]

-u : किसी विशिष्ट उपयोगकर्ता खाते द्वारा खोली गई फ़ाइलों और प्रक्रियाओं की सूची देखता है।
-c : निर्दिष्ट प्रक्रिया नाम से शुरू होने वाली प्रक्रियाओं द्वारा खोली गई फ़ाइलों की सूची को फ़िल्टर करता है।
-p : किसी विशिष्ट प्रक्रिया आईडी (PID) द्वारा खोली गई फ़ाइलों की सूची की जांच करता है।
-i : नेटवर्क सॉकेट्स और विशिष्ट पोर्ट्स का उपयोग करने वाली प्रक्रियाओं को देखता है।
+D : निर्दिष्ट निर्देशिका और उसके उप-पथों में खुली फ़ाइलों की सूची को पुनरावर्ती रूप से (recursively) खोजता है।
-t : स्क्रिप्ट एकीकरण के लिए उपयोगी, केवल प्रक्रिया आईडी (PID) को एक-एक पंक्ति में संक्षिप्त रूप से आउटपुट करता है।

lsof -v

lsof अभ्यास के लिए एक परीक्षण निर्देशिका और नमूना फ़ाइल तैयार करने हेतु mkdir -p /tmp/lsof_lab && echo '테스트 파일 내용' > /tmp/lsof_lab/sample.txt कमांड निष्पादित करें।

mkdir -p /tmp/lsof_lab && echo ‘테스트 파일 내용’ > /tmp/lsof_lab/sample.txt

बनाई गई नमूना फ़ाइल को प्रक्रिया द्वारा खुला रखने के लिए पृष्ठभूमि (background) में ट्रैक करने हेतु tail -f /tmp/lsof_lab/sample.txt & कमांड निष्पादित करें।

tail -f /tmp/lsof_lab/sample.txt &

lsof -u $(whoami) | head -n 15 कमांड वर्तमान में लॉग-इन उपयोगकर्ता द्वारा चलाई जा रही प्रक्रियाओं द्वारा उपयोग की जा रही फ़ाइलों की सूची की शीर्ष 15 पंक्तियों को प्रदर्शित करता है।
आप बुनियादी सिस्टम लाइब्रेरीज़ और निष्पादन योग्य फ़ाइलों सहित वर्तमान खाते द्वारा खोली गई फ़ाइलों का विवरण देख सकते हैं।

lsof -u $(whoami) | head -n 15

lsof -c tail कमांड उन फ़ाइलों और लाइब्रेरीज़ की सूची खोजकर आउटपुट करता है जिन्हें tail नाम की प्रक्रिया ने खोला हुआ है।
इसके माध्यम से, आप सत्यापित कर सकते हैं कि पृष्ठभूमि में चल रहा tail कमांड किन फ़ाइल डिस्क्रिप्टर्स और साझा लाइब्रेरीज़ को संदर्भित कर रहा है।

lsof -c tail

अभ्यास पूरा करने के बाद, पृष्ठभूमि में चल रही tail प्रक्रिया को सुरक्षित रूप से समाप्त और साफ़ करने के लिए killall tail 2>/dev/null || true कमांड निष्पादित करें।

killall tail 2>/dev/null || true

नेटवर्क पोर्ट जांच और प्रक्रिया टकराव की ट्रबलशूटिंग

पोर्ट जांच और प्रक्रिया टकराव अभ्यास वातावरण तैयार करने के लिए, सिस्टम में python3 स्थापित है या नहीं इसकी जांच करें और स्थापित न होने पर पैकेज स्थापित करें।

command -v python3 >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y python3)

नेटवर्क पोर्ट उपयोग परीक्षण के लिए पृष्ठभूमि में पोर्ट 8080 पर एक सरल वेब सर्वर चलाएं।

python3 -m http.server 8080 >/dev/null 2>&1 &

पृष्ठभूमि में चलाए गए वेब सर्वर प्रोसेस के पोर्ट 8080 से ठीक से बाइंड होने तक 1 सेकंड प्रतीक्षा करें।

sleep 1

lsof -i :8080 कमांड 8080 पोर्ट का उपयोग कर रही प्रक्रियाओं की जांच करता है।
आउटपुट परिणाम से यह पुष्टि की जा सकती है कि PID 371 वाली python3 प्रक्रिया पोर्ट 8080 पर LISTEN स्थिति में प्रतीक्षा कर रही है।

lsof -i :8080

lsof -i -P -n | head -n 15 कमांड सिस्टम के नेटवर्क सॉकेट्स की सूची को पोर्ट नंबर और IP एड्रेस रूपांतरण के बिना संख्यात्मक रूप में तेज़ी से आउटपुट करता है।
चूँकि यह DNS रिवर्स लुकअप और सर्विस पोर्ट नाम मैपिंग प्रक्रिया को छोड़ देता है, इसलिए बिना किसी देरी के तुरंत पोर्ट उपयोग की स्थिति को समझा जा सकता है।

lsof -i -P -n | head -n 15

lsof -i TCP:8080 -sTCP:LISTEN कमांड पोर्ट 8080 में से केवल TCP प्रोटोकॉल और LISTEN स्थिति में मौजूद कनेक्शनों को सटीक रूप से फ़िल्टर करके आउटपुट करता है।
अनावश्यक सत्र कनेक्शनों को छोड़कर वास्तव में उस पोर्ट पर कनेक्शन की प्रतीक्षा कर रहे डेमॉन प्रोसेस की सटीक पहचान करने के लिए यह बहुत उपयोगी है।

lsof -i TCP:8080 -sTCP:LISTEN

अभ्यास पूरा करने के बाद, पोर्ट 8080 TCP को अधिग्रहित करने वाली पृष्ठभूमि वेब सर्वर प्रक्रिया को जबरन समाप्त करके संसाधनों को साफ़ करें।

fuser -k 8080/tcp 2>/dev/null || kill $(lsof -t -i :8080) 2>/dev/null || true

विशिष्ट निर्देशिका और अनमाउंट को बाधित करने वाली फ़ाइलों (Device Busy) की ट्रैकिंग

निर्देशिका उपयोग और अनमाउंट बाधा की स्थिति को पुनः उत्पन्न करने के लिए, अभ्यास निर्देशिका बनाएं और उस पथ पर जाएं।

mkdir -p /tmp/mount_test && cd /tmp/mount_test

प्रक्रिया द्वारा पढ़ी जाने वाली लक्ष्य लॉग फ़ाइल बनाने के लिए echo '작업 중인 파일' > active_work.log कमांड निष्पादित करें।

echo ‘작업 중인 파일’ > active_work.log

बनाई गई फ़ाइल को मानक इनपुट के रूप में संदर्भित करके लगातार अधिग्रहित रखने के लिए पृष्ठभूमि में sleep प्रक्रिया चलाएं।

sleep 30 < active_work.log &

अधिग्रहित निर्देशिका के बाहर से स्थिति की जांच करने के लिए कार्य पथ को होम निर्देशिका में बदलें।

cd /root || cd ~

lsof +D /tmp/mount_test कमांड निर्दिष्ट निर्देशिका और उसके उप-पथों में खुली सभी फ़ाइलों और प्रक्रियाओं को पुनरावर्ती रूप से ट्रैक करके आउटपुट करता है।
आउटपुट परिणाम से यह पुष्टि की जा सकती है कि PID 450 की sleep प्रक्रिया उस निर्देशिका को वर्तमान कार्य निर्देशिका (cwd) के रूप में संदर्भित कर रही है, और active_work.log फ़ाइल को रीड मोड (0r) में खोले हुए है, जो अनमाउंट को बाधित करने का मुख्य कारण है।

lsof +D /tmp/mount_test

अभ्यास पूरा करने के बाद, निर्देशिका और फ़ाइल को अधिग्रहित करने वाली पृष्ठभूमि sleep प्रक्रिया को सुरक्षित रूप से समाप्त करें।

killall sleep 2>/dev/null || true

अभ्यास में उपयोग की गई अस्थायी परीक्षण निर्देशिका और उप-फ़ाइलों को हटाकर सिस्टम संसाधनों को साफ़ करें।

rm -rf /tmp/mount_test

हटाई गई लेकिन डिस्क पर जगह घेरे हुए घोस्ट फ़ाइलों (deleted) की रिकवरी और सफ़ाई

डिस्क स्पेस लीकेज परीक्षण के लिए अभ्यास निर्देशिका बनाएं और 10MB आकार की एक बड़ी परीक्षण फ़ाइल बनाएं।

mkdir -p /tmp/leak_test && dd if=/dev/zero of=/tmp/leak_test/large.img bs=1M count=10 >/dev/null 2>&1

प्रक्रिया द्वारा बनाई गई बड़ी फ़ाइल के हैंडल को बनाए रखने के लिए पृष्ठभूमि में ट्रैक करें।

tail -f /tmp/leak_test/large.img &

घोस्ट फ़ाइल लीकेज की स्थिति को फिर से बनाने के लिए फ़ाइल सिस्टम से उपयोग में मौजूद बड़ी फ़ाइल को जबरन हटा दें।

rm -f /tmp/leak_test/large.img

lsof | grep '(deleted)' | head -n 5' कमांड उन फ़ाइलों की सूची प्रदर्शित करता है जिन्हें फ़ाइल सिस्टम से हटा दिया गया है लेकिन प्रक्रिया द्वारा अभी भी खुला रखा गया है और वे डिस्क स्पेस घेरे हुए हैं।
इसके माध्यम से, आप उन घोस्ट फ़ाइलों और संबंधित प्रक्रियाओं को तेज़ी से ट्रैक कर सकते हैं जिनकी डिस्क स्पेस rm कमांड से हटाने के बाद भी खाली नहीं हुई है।

lsof | grep ‘(deleted)’ | head -n 5

lsof -t द्वारा निकाले गए प्रक्रिया आईडी के आधार पर /proc/$TARGET_PID/fd/ निर्देशिका में फ़ाइल डिस्क्रिप्टर सूची देखें।
प्रक्रिया द्वारा संदर्भित फ़ाइल डिस्क्रिप्टर नंबर की सीधे जांच करके, प्रक्रिया को पुनरारंभ किए बिना स्पेस खाली किया जा सकता है या यदि आवश्यक हो तो उस डिस्क्रिप्टर के माध्यम से हटाए गए मूल डेटा को पुनर्प्राप्त (recover) किया जा सकता है।

TARGET_PID=$(lsof -t /tmp/leak_test/large.img 2>/dev/null | head -n 1) && [ -n “$TARGET_PID” ] && ls -l /proc/$TARGET_PID/fd/ || true

अभ्यास पूरा करने के बाद, घोस्ट फ़ाइल को अधिग्रहित करने वाली पृष्ठभूमि प्रक्रिया को सुरक्षित रूप से समाप्त करें ताकि डिस्क स्थान पूरी तरह से खाली हो जाए।

killall tail 2>/dev/null || true

अभ्यास में उपयोग की गई अस्थायी परीक्षण निर्देशिका को पूरी तरह से हटाकर सिस्टम संसाधनों को साफ़ करें।

rm -rf /tmp/leak_test

अब तक, हमने lsof कमांड का उपयोग करके पोर्ट टकराव को हल करने से लेकर हटाई गई फ़ाइलों की डिस्क क्षमता को खाली करने तक के व्यावहारिक मुख्य सुझावों को संक्षेप में देखा है।
आशा है कि यह संकलित जानकारी वास्तविक सर्वर संचालन और समस्या निवारण (troubleshooting) स्थितियों में समस्याओं को हल करने में काफी मददगार साबित होगी।