कभी कभी, मैं एक अनमाउंट करने के लिए चाहते हैं USB डिवाइस के साथ umount /run/media/theDriveहै, लेकिन मैं एक मिल drive is busyत्रुटि।
मुझे कैसे पता चलेगा कि कौन सी प्रक्रिया या कार्यक्रम डिवाइस तक पहुंच रहे हैं?
कभी कभी, मैं एक अनमाउंट करने के लिए चाहते हैं USB डिवाइस के साथ umount /run/media/theDriveहै, लेकिन मैं एक मिल drive is busyत्रुटि।
मुझे कैसे पता चलेगा कि कौन सी प्रक्रिया या कार्यक्रम डिवाइस तक पहुंच रहे हैं?
जवाबों:
lsof | grep /media/whateverमाउंट का उपयोग करने का पता लगाने के लिए उपयोग करें।
इसके अलावा, umount -lसफाई करते समय ड्राइव का उपयोग करने से नई प्रक्रियाओं को रोकने के लिए (आलसी umount) पर विचार करें ।
fuser -mv /path/to/mountpointएक mointpoint का उपयोग कर प्रक्रियाओं का पता लगाने के लिए एक अधिक पठनीय विकल्प हो सकता है।
lsof | grepमेरे लिए बेहतर काम करता है। fuser -mvलगता है सिर्फ असंबंधित प्रक्रियाओं के 80 + डंप करने के लिए। मैं माउंट बाइंडेड निर्देशिकाओं का उपयोग कर रहा हूं।
umount -lखतरनाक है । इसके बजाय शीर्ष पर mount -o bind एक मोड 000खाली निर्देशिका, और के माध्यम से साफ lsof +f -- /dev/device।
अधिकांश समय, उपयोग करने के लिए सबसे अच्छा कमांड है lsof (" l i s t o pen f iles")।
lsof +f -- /media/usb0
जहाँ /media/usb0USB ड्राइव या अन्य फाइल सिस्टम का माउंट पॉइंट अनमाउंट करने के लिए है। +f --माउंट बिंदु के रूप में बाद के तर्क का इलाज करने के लिए lsof को बताता है; यह आमतौर पर होता है, लेकिन हमेशा नहीं, अपने दम पर सफल होता है, इसलिए यह lsof /media/usb0भी काम करता है। यह ओपन फाइल्स (यहां तक कि अनलिंक किए गए), मेमोरी मैप्ड फाइल्स, करंट डाइरेक्टरीज़ और कुछ और अस्पष्ट उपयोगों का पता लगाता है। आपको अन्य उपयोगकर्ताओं की प्रक्रियाओं के बारे में जानकारी प्राप्त करने के लिए कमांड को रूट के रूप में चलाने की आवश्यकता होगी (और मुझे लगता है कि वहां यूनियनों हैं जहां lsofरूट के रूप में चलाया जाना है)।
ऐसे उपयोग हैं जो lsof नहीं पाएंगे; हटाने योग्य मीडिया पर ये असामान्य हैं। उनमे शामिल है:
/fooयदि आप /foo/barआरोह बिंदु है तो आप अनमाउंट नहीं कर सकते ।/fooयदि /foo/barआप एक माउंटेड ब्लॉक डिवाइस या लूप-माउंटेड रेग्युलर फाइल है, या यह लिनक्स लिंड माउंट का स्रोत है, तो इसे अनमाउंट नहीं कर सकते ।एक और आदेश जो चुटकी में काम कर सकता है वह है फ्यूज़र, जो केवल डिवाइस पर खुली फाइलों के साथ प्रक्रियाओं की पीआईडी को सूचीबद्ध करता है:
fuser -m /media/usb0
आप lsofपीटर की तरह उपयोग कर सकते हैं , या यदि आप सुनिश्चित हैं कि आप बस उन सभी चीजों को मारना चाहते हैं और इसे अनमाउंट कर सकते हैं, तो आप शायद कुछ ऐसा कर सकते हैं:
fuser -Mk /mnt/path
umount /mnt/path
-Mसुरक्षा के लिए उपयोग करना देखें।
-Mको लागू किया जाना चाहिए।
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
खुली फाइलों के साथ प्रक्रियाएं सामान्य अपराधी हैं। उन्हें प्रदर्शित करें:
lsof +f -- <mountpoint or device>
/dev/<device>इसके बजाय का उपयोग करने का एक फायदा है /mountpoint: एक के बाद एक माउंटपॉइंट गायब हो जाएगा umount -l, या यह एक ओवरलैड माउंट द्वारा छिपाया जा सकता है।
fuserभी इस्तेमाल किया जा सकता है, लेकिन मेरे दिमाग lsofमें एक अधिक उपयोगी आउटपुट है। हालाँकि fuserयह तब उपयोगी होता है जब यह आपके ड्रामा को पैदा करने वाली प्रक्रियाओं को मारने के लिए आता है ताकि आप अपने जीवन के साथ आगे बढ़ सकें।
सूची फ़ाइलों पर <mountpoint>(ऊपर चेतावनी देखें):
fuser -vmM <mountpoint>
लिखने के लिए खुलने वाली फाइलों के साथ इंटरएक्टिवली केवल प्रक्रियाओं को मारें:
fuser -vmMkiw <mountpoint>
रीड-ओनली ( mount -o remount,ro <mountpoint>) के रीमाउंटिंग के बाद , सभी शेष प्रक्रियाओं को मारना सुरक्षित (r) है:
fuser -vmMk <mountpoint>
अपराधी ही कर्नेल हो सकता है। जिस फाइलसिस्टम पर आप प्रयास कर रहे हैं, उस पर एक और फाइलसिस्टम umountशोक पैदा करेगा। इससे जाँच करें:
mount | grep <mountpoint>/
लूपबैक माउन्ट्स ( धन्यवाद स्टीफन किट ) के लिए, इसके आउटपुट की भी जाँच करें:
losetup -la
अनाम इनोड्स द्वारा बनाया जा सकता है:
openसाथ O_TMPFILE)ये सबसे अधिक मायावी प्रकार के पोकेमॉन हैं, और lsof's TYPEकॉलम में दिखाई देते हैं a_inode(जो कि lsofमैन पेज में अनडूम्ड है )।
वे इसमें दिखाई नहीं देंगे lsof +f -- /dev/<device>, इसलिए आपको इसकी आवश्यकता होगी:
lsof | grep a_inode
अनाम इनकोड धारण करने वाली प्रक्रियाओं को मारने के लिए, देखें: वर्तमान इनऑटाइज़ घड़ियों (पथनाम, पीआईडी) को सूचीबद्ध करें ।
inotify घड़ियों (लिनक्स)यह टिप्पणी बताती है कि क्यों inotify नहीं एक अनमाउंट को रोका जाना चाहिए , लेकिन यह नोट उन स्थितियों का वर्णन करता है जिनमें यह होगा :
एक अनमाउंट
vx_softcnt_flush()कॉल में लटका जा सकता है । हैंग होता है क्योंकि इनॉटिफ़ाइ वॉचi_countवैरिएबल को बढ़ाता है औरv_os_hold valueतब तक ऊंचा बना रहता है जब तक कि टॉटिफाई वॉचर होल्ड को जारी नहीं करता।
lsof।
Mountpointsअनुभाग में जोड़ा गया ।
के लिए (कम से कम) OpenBSD:
$ fstat /mnt/mountpoint
उदाहरण के लिए ( जैसा कि हम अन्यथा केवल अपनी प्रक्रियाओं को देखेंगे, रूट के रूप में doasनिष्पादित fstatकरना):
$ doas fstat /usr/ports
USER CMD PID FD MOUNT INUM MODE R/W SZ|DV NAME
_pbuild make 15172 wd /usr/ports 3923598 drwxrwxr-x r 1536 /usr/ports/
_pbuild make 40034 wd /usr/ports 3923598 drwxrwxr-x r 1536 /usr/ports/
इस मामले में, मैं /usr/portsतब तक अनमाउंट नहीं कर पाऊंगा जब तक कि उपयोगकर्ता _pbuildउन दो makeप्रक्रियाओं को पूरा नहीं कर लेता ।
यह एक सामान्य नुकसान है: आप एक अलग उपयोगकर्ता (या तो रूट या किसी अन्य उपयोगकर्ता) पर मुकदमा करते हैं, एक घुड़सवार डिवाइस की निर्देशिका में बदलते हैं, और फिर उस उपयोगकर्ता के रूप में लॉग आउट करते हैं। जब आप भूल जाते हैं कि आप उस निर्देशिका में चले गए हैं, तो आप कोशिश कर सकते हैं और तब तक ढूंढ सकते हैं जब तक आप अंधे नहीं होते। lsofवह शेल दिखाता है जो वर्तमान निर्देशिका उस उपकरण का उपयोग कर रही है। आप अपनी निर्देशिका को बदलने के लिए फिर से उस उपयोगकर्ता के रूप में मुकदमा करना चाहते हैं।