मुझे कैसे पता चलेगा कि कौन सी प्रक्रिया किसी डिवाइस को अनमाउंट करने से रोक रही है?


58

कभी कभी, मैं एक अनमाउंट करने के लिए चाहते हैं USB डिवाइस के साथ umount /run/media/theDriveहै, लेकिन मैं एक मिल drive is busyत्रुटि।

मुझे कैसे पता चलेगा कि कौन सी प्रक्रिया या कार्यक्रम डिवाइस तक पहुंच रहे हैं?


1
यहाँ पर एक ही प्रश्न / उत्तर के लिए अधिक उत्थान: stackoverflow.com/questions/624154/…
ट्रेवर बॉयड स्मिथ

जवाबों:


57

lsof | grep /media/whateverमाउंट का उपयोग करने का पता लगाने के लिए उपयोग करें।

इसके अलावा, umount -lसफाई करते समय ड्राइव का उपयोग करने से नई प्रक्रियाओं को रोकने के लिए (आलसी umount) पर विचार करें ।


24
fuser -mv /path/to/mountpointएक mointpoint का उपयोग कर प्रक्रियाओं का पता लगाने के लिए एक अधिक पठनीय विकल्प हो सकता है।
रिकार्डो मुर्री

@RiccardoMurri lsof | grepमेरे लिए बेहतर काम करता है। fuser -mvलगता है सिर्फ असंबंधित प्रक्रियाओं के 80 + डंप करने के लिए। मैं माउंट बाइंडेड निर्देशिकाओं का उपयोग कर रहा हूं।
रिक्की बॉयस

1
umount -lखतरनाक है । इसके बजाय शीर्ष पर mount -o bind एक मोड 000खाली निर्देशिका, और के माध्यम से साफ lsof +f -- /dev/device
टॉम हेल

35

अधिकांश समय, उपयोग करने के लिए सबसे अच्छा कमांड है 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आप एक माउंटेड ब्लॉक डिवाइस या लूप-माउंटेड रेग्युलर फाइल है, या यह लिनक्स लिंड माउंट का स्रोत है, तो इसे अनमाउंट नहीं कर सकते ।
  • NFS निर्यात: lsof यह नहीं पता लगाएगा कि एक पेड़ कर्नेल NFS सर्वर द्वारा निर्यात किया गया है।

एक और आदेश जो चुटकी में काम कर सकता है वह है फ्यूज़र, जो केवल डिवाइस पर खुली फाइलों के साथ प्रक्रियाओं की पीआईडी ​​को सूचीबद्ध करता है:

fuser -m /media/usb0

8

आप lsofपीटर की तरह उपयोग कर सकते हैं , या यदि आप सुनिश्चित हैं कि आप बस उन सभी चीजों को मारना चाहते हैं और इसे अनमाउंट कर सकते हैं, तो आप शायद कुछ ऐसा कर सकते हैं:

fuser -Mk /mnt/path
umount /mnt/path

1
यदि आप ऐसा करने जा रहे हैं, तो -Mसुरक्षा के लिए उपयोग करना देखें।
टॉम हेल

@TomHale आप स्पष्ट करना चाहते हैं कि किस कमांड -Mको लागू किया जाना चाहिए।
एचएसचमले

1
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.
टॉम हेल

6

खुली फ़ाइलें

खुली फाइलों के साथ प्रक्रियाएं सामान्य अपराधी हैं। उन्हें प्रदर्शित करें:

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>

mountpoints

अपराधी ही कर्नेल हो सकता है। जिस फाइलसिस्टम पर आप प्रयास कर रहे हैं, उस पर एक और फाइलसिस्टम umountशोक पैदा करेगा। इससे जाँच करें:

mount | grep <mountpoint>/

लूपबैक माउन्ट्स ( धन्यवाद स्टीफन किट ) के लिए, इसके आउटपुट की भी जाँच करें:

losetup -la

अनाम इनोडेस (लिनक्स)

अनाम इनोड्स द्वारा बनाया जा सकता है:

ये सबसे अधिक मायावी प्रकार के पोकेमॉन हैं, और 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अनुभाग में जोड़ा गया ।
टॉम हेल

5

यदि आप GNOME का उपयोग करते हैं, तो Nautilus के माध्यम से अनमाउंट करना एक संदेश प्रदर्शित करेगा जिसमें कहा गया है कि कौन सी प्रक्रिया अभी भी ड्राइव का उपयोग कर रही है, और वह फ़ाइल जिसका उपयोग कर रही है।

वैकल्पिक शब्द


1

के लिए (कम से कम) 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प्रक्रियाओं को पूरा नहीं कर लेता ।


-2

यह एक सामान्य नुकसान है: आप एक अलग उपयोगकर्ता (या तो रूट या किसी अन्य उपयोगकर्ता) पर मुकदमा करते हैं, एक घुड़सवार डिवाइस की निर्देशिका में बदलते हैं, और फिर उस उपयोगकर्ता के रूप में लॉग आउट करते हैं। जब आप भूल जाते हैं कि आप उस निर्देशिका में चले गए हैं, तो आप कोशिश कर सकते हैं और तब तक ढूंढ सकते हैं जब तक आप अंधे नहीं होते। lsofवह शेल दिखाता है जो वर्तमान निर्देशिका उस उपकरण का उपयोग कर रही है। आप अपनी निर्देशिका को बदलने के लिए फिर से उस उपयोगकर्ता के रूप में मुकदमा करना चाहते हैं।


2
यह उत्तर या तो अधूरा है या गलत है। मुझे यकीन नहीं है क्योंकि यह स्पष्ट नहीं है।
2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.