Mac यूज़र्स के लिए lsof कमांड की पूरी जानकारी
lsof कमांड में महारत हासिल करें और पता लगाएँ कि आपके Mac पर कौन से प्रोसेस ने फ़ाइलें खोल रखी हैं। डेवलपर और पावर यूज़र्स के लिए एक गाइड।
आपकी external ड्राइव eject नहीं हो रही। macOS आपको झुंझला देने वाला धुंधला सा मैसेज देता है कि “one or more programs may be using it”। कौन से प्रोग्राम? यह नहीं बताएगा। यहीं lsof काम आता है।
इसका नाम “list open files” से बना है, और यह बिल्कुल यही करता है। macOS जैसे Unix-आधारित सिस्टम पर लगभग हर चीज़ को एक फ़ाइल की तरह माना जाता है, जिसमें नेटवर्क कनेक्शन, डिवाइस, और disk वॉल्यूम शामिल हैं। जब आप कोई ड्राइव eject नहीं कर पाते, तो lsof आपको ठीक-ठीक बताता है कि कौन सा प्रोसेस उसे बंधक बनाए हुए है।
बुनियादी सिंटैक्स
ejection समस्याओं के लिए lsof इस्तेमाल करने का सबसे आसान तरीका है:
lsof /Volumes/YourDriveName
“YourDriveName” को अपनी ड्राइव के असली नाम से बदलें। अगर नाम में स्पेस हैं, तो पूरे पाथ को कोट्स में लपेट दें:
lsof "/Volumes/My Backup Drive"
यह हर उस प्रोसेस की लिस्ट देता है जिसने उस वॉल्यूम पर कोई file handle खोल रखा है। हर लाइन प्रोसेस का नाम, उसका ID (PID), उसे चलाने वाला यूज़र, और एक्सेस की जा रही ख़ास फ़ाइल की जानकारी दिखाती है।
आउटपुट पढ़ना
एक सामान्य lsof आउटपुट कुछ ऐसा दिखता है:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mds_store 1234 root 4r REG 1,12 524288 ... /Volumes/External/.Spotlight-V100/...
Finder 5678 you 3r DIR 1,12 1024 ... /Volumes/External
सबसे ज़रूरी कॉलम हैं COMMAND (प्रोसेस का नाम), PID (प्रोसेस ID जिससे आप उसे kill करेंगे), और NAME (जिस फ़ाइल को एक्सेस किया जा रहा है उसका असली पाथ)।
FD कॉलम दिखाता है कि फ़ाइल को कैसे इस्तेमाल किया जा रहा है। नंबर के बाद “r” का मतलब है रीड एक्सेस, “w” का मतलब राइट, और “u” का मतलब रीड और राइट दोनों। अगर आपको “cwd” दिखता है, तो उस प्रोसेस की मौजूदा वर्किंग डायरेक्टरी वही जगह है। ऐसा तब होता है जब आपने ड्राइव के किसी फ़ोल्डर में कोई Terminal विंडो खोल रखी हो।
पता लगाएँ कि आपकी ड्राइव को क्या ब्लॉक कर रहा है
ख़ास तौर पर ejection समस्याओं के लिए, आपको आमतौर पर बस यह जानना होता है कि कौन से प्रोसेस नाम दिख रहे हैं। आम गुनहगारों में शामिल हैं mds और mds_stores (Spotlight indexing), Finder, QuickLookUIService (थंबनेल जेनरेशन), और fsevents (फ़ाइलसिस्टम वॉचर)।
अगर आपको बहुत सारा आउटपुट दिखे और आप उसे छोटा करना चाहें, तो आप grep इस्तेमाल कर सकते हैं:
lsof /Volumes/YourDriveName | grep -v "^COMMAND"
यह हेडर लाइन हटा देता है ताकि आपको सिर्फ़ असली प्रोसेस दिखें। अगर आप सिर्फ़ अलग-अलग प्रोसेस नाम चाहते हैं:
lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u
काम के फ़्लैग
-c फ़्लैग कमांड के नाम से फ़िल्टर करता है। अगर आपको शक है कि Spotlight समस्या है:
lsof -c mds /Volumes/YourDriveName
यह सिर्फ़ वे प्रोसेस दिखाता है जिनके नाम “mds” से शुरू होते हैं।
+D फ़्लैग किसी डायरेक्टरी की सभी खुली फ़ाइलें रिकर्सिव तरीके से लिस्ट करता है:
lsof +D /Volumes/YourDriveName
यह बुनियादी सिंटैक्स से ज़्यादा गहन है पर बहुत सारी फ़ाइलों वाली बड़ी ड्राइव पर धीमा हो सकता है।
यह देखने के लिए कि किसी ख़ास यूज़र ने ड्राइव पर कौन से प्रोसेस खोल रखे हैं:
lsof -u yourusername /Volumes/YourDriveName
sudo के बिना lsof इस्तेमाल करना
डिफ़ॉल्ट रूप से, lsof सिर्फ़ आपके यूज़र अकाउंट के मालिकाना वाले प्रोसेस दिखाता है। root द्वारा चलाए जाने वाले सिस्टम प्रोसेस (जैसे Spotlight का mds) तब तक नहीं दिखेंगे जब तक आप lsof को sudo के साथ न चलाएँ:
sudo lsof /Volumes/YourDriveName
आपको अपना पासवर्ड डालना होगा। ejection समस्याओं को सुलझाने के लिए, sudo इस्तेमाल करना लगभग हमेशा ज़रूरी होता है क्योंकि अक्सर ब्लॉकर सिस्टम प्रोसेस ही होते हैं।
ब्लॉक करने वाले प्रोसेस को kill करना
एक बार जब आपको lsof आउटपुट से प्रोसेस ID (PID) पता चल जाए, तो आप उसे बंद कर सकते हैं:
kill 1234
1234 को असली PID से बदलें। अगर वह काम न करे, तो आप इसे ज़बरदस्ती बंद कर सकते हैं:
kill -9 1234
इसमें सावधानी बरतें। mds जैसे सिस्टम प्रोसेस को kill करने से अस्थायी समस्याएँ हो सकती हैं। प्रोसेस आमतौर पर अपने-आप दोबारा शुरू हो जाएगा, पर हो सकता है Spotlight एक मिनट के लिए अजीब व्यवहार करे। Finder जैसी ऐप्लिकेशन को kill करना आमतौर पर सुरक्षित है; macOS Finder को अपने-आप दोबारा शुरू कर देगा।
अपनी मालिकाना ऐप्लिकेशन के लिए (जैसे ड्राइव की डायरेक्टरी में बैठे शेल वाली कोई Terminal विंडो), eject करने की कोशिश से पहले ऐप्लिकेशन को सामान्य तरीके से बंद कर देना या ड्राइव से कहीं और चले जाना ज़्यादा साफ़-सुथरा तरीका है।
आम परिस्थितियाँ
Terminal की मौजूदा डायरेक्टरी ड्राइव पर हो: अगर आपने अपनी external ड्राइव के किसी फ़ोल्डर में cd कर रखा है, तो वह शेल प्रोसेस ड्राइव को खुला रखेगा। या तो कहीं और cd करें (cd ~) या उस Terminal विंडो को बंद करें।
Finder विंडो: अगर Finder की कोई विंडो ड्राइव पर खुली है, या साइडबार में ड्राइव सिलेक्ट भी है, तो यह ejection रोक सकता है। ड्राइव का कंटेंट दिखाने वाली कोई भी Finder विंडो बंद करें।
Spotlight indexing: mds, mds_stores, और mdworker प्रोसेस नई ड्राइव को अपने-आप इंडेक्स करते हैं। आप उनके पूरा होने का इंतज़ार कर सकते हैं, sudo mdutil -i off /Volumes/YourDriveName से indexing बंद कर सकते हैं, या उन्हें सीधे kill कर सकते हैं।
फ़ाइलें खुली रखने वाले बैकग्राउंड ऐप्स: कुछ ऐप्लिकेशन डॉक्यूमेंट बंद करने के बाद भी हाल की फ़ाइलों का रेफ़रेंस बनाए रखते हैं। Photoshop या वीडियो एडिटर जैसी क्रिएटिव ऐप्लिकेशन आम गुनहगार हैं। ऐप को पूरी तरह quit करने से आमतौर पर फ़ाइलें रिलीज़ हो जाती हैं।
कमांड लाइन से आगे
अगर आप Terminal के साथ सहज नहीं हैं या हर बार ड्राइव अनप्लग करने के लिए lsof आउटपुट से जूझना नहीं चाहते, तो ग्राफ़िकल विकल्प मौजूद हैं।
Activity Monitor आपको किसी ख़ास प्रोसेस की खुली फ़ाइलें दिखा सकता है, पर इसके लिए आपको पहले से पता होना चाहिए कि किस प्रोसेस को जाँचना है। यह “इस ड्राइव को क्या इस्तेमाल कर रहा है?” का जवाब आसानी से नहीं देता।
Ejecta ख़ास इसी समस्या के लिए बनाया गया है। यह आपकी कनेक्टेड ड्राइव दिखाता है, पहचानता है कि हर एक को कौन से प्रोसेस ब्लॉक कर रहे हैं, और आपको उन प्रोसेस को एक क्लिक से quit करने देता है। यह असल में उस जासूसी काम का एक GUI रैपर है जिसके लिए lsof की ज़रूरत पड़ती है, साथ ही सिस्टम प्रोसेस को सुरक्षित तरीके से संभालने की समझ भी।
कमांड लाइन उन लोगों के लिए ताक़तवर है जो इसे पसंद करते हैं, पर ड्राइव अनप्लग करने जैसे आसान काम के लिए यह अनिवार्य नहीं होनी चाहिए।
अगर आप हर बार Terminal इस्तेमाल नहीं करना चाहते, तो Ejecta आपको ठीक-ठीक दिखाता है कि कौन सा process आपके drive को रोक रहा है — और सीधे आपके menu bar से एक क्लिक में उसे बंद कर देता है।
अभी खरीदें — $9.99