कभी कभी, मैं एक अनमाउंट करने के लिए चाहते हैं 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/usb0
USB ड्राइव या अन्य फाइल सिस्टम का माउंट पॉइंट अनमाउंट करने के लिए है। +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
वह शेल दिखाता है जो वर्तमान निर्देशिका उस उपकरण का उपयोग कर रही है। आप अपनी निर्देशिका को बदलने के लिए फिर से उस उपयोगकर्ता के रूप में मुकदमा करना चाहते हैं।