บางครั้งฉันต้องการยกเลิกการต่อเชื่อมอุปกรณ์ 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 รายการ ฉันใช้เมานท์ไดเรกทอรีผูก
ส่วนใหญ่แล้วคำสั่งที่ดีที่สุดในการใช้คือlsof (“ l i s t o pen f iles”)
lsof +f -- /media/usb0
โดยที่/media/usb0
จุดเชื่อมต่อของไดรฟ์ USB หรือระบบไฟล์อื่นเป็น unmount +f --
บอกให้ lsof จัดการกับอาร์กิวเมนต์ที่ตามมาในฐานะจุดเชื่อมต่อ มันมักจะ แต่ไม่เสมอไปจัดการด้วยตัวเองเพื่อที่lsof /media/usb0
ยังใช้งานได้ สิ่งนี้จะค้นหาไฟล์ที่เปิดอยู่ (แม้แต่ไฟล์ที่ไม่ได้ลิงก์) ไฟล์ที่แม็พหน่วยความจำไดเรกทอรีปัจจุบันและการใช้งานที่ไม่ชัดเจน คุณจะต้องเรียกใช้คำสั่งในฐานะรูทเพื่อรับข้อมูลเกี่ยวกับกระบวนการของผู้ใช้รายอื่น (และฉันคิดว่ามี unices ที่lsof
จะต้องทำงานเป็นรูท)
มีการใช้งานที่ lsof จะไม่พบ; สิ่งเหล่านี้ผิดปกติในสื่อที่ถอดได้ พวกเขารวมถึง:
/foo
ถ้า/foo/bar
เป็นจุดเมานท์/foo
ถ้า/foo/bar
เป็นอุปกรณ์บล็อกที่ติดตั้งหรือไฟล์ปกติที่ติดตั้งแบบวนซ้ำหรือหากเป็นแหล่งที่มาของการเชื่อมโยง Linuxคำสั่งอื่นที่สามารถให้บริการได้ใน pinch คือ fuser ซึ่งแสดงรายการ PID ของกระบวนการที่มีไฟล์เปิดอยู่บนอุปกรณ์เท่านั้น:
fuser -m /media/usb0
คุณสามารถใช้lsof
อย่างที่ Peter พูดหรือถ้าคุณแน่ใจว่าคุณต้องการฆ่าสิ่งเหล่านั้นทั้งหมดและเลิกเมานท์คุณอาจทำสิ่งต่อไปนี้:
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>/
สำหรับการติดตั้งลูปแบ็ค ( ขอบคุณ Stephen Kitt ) ให้ตรวจสอบผลลัพธ์ของ:
losetup -la
inodes นิรนามสามารถสร้างได้โดย:
open
พร้อมO_TMPFILE
)เหล่านี้เป็นชนิดที่เข้าใจยากที่สุดของโปเกมอนและปรากฏในlsof
's TYPE
คอลัมน์เป็นa_inode
(ซึ่งไม่มีเอกสารใน lsof
หน้าคน )
พวกเขาจะไม่ปรากฏในlsof +f -- /dev/<device>
ดังนั้นคุณจะต้อง:
lsof | grep a_inode
สำหรับกระบวนการฆ่าที่มีinode ที่ไม่ระบุชื่อดู: แสดงรายการ inotify watches (ชื่อพา ธ , PID) ในปัจจุบัน
inotify
นาฬิกา (Linux)ความคิดเห็นนี้อธิบายถึงสาเหตุที่inotify
ไม่ควรป้องกันการยกเลิกการต่อเชื่อม แต่หมายเหตุนี้อธิบายถึงสถานการณ์ที่จะ :
unmount สามารถวาง
vx_softcnt_flush()
สาย การแฮงค์เกิดขึ้นเนื่องจาก inotify watches เพิ่มi_count
ตัวแปรและทำให้ค่าv_os_hold value
ยังคงอยู่ในระดับสูงจนกระทั่ง inotify watcher ปล่อยการพัก
lsof
แต่ไม่มีอะไรที่จะแสดงขึ้นใน
Mountpoints
ส่วน
หากคุณใช้ GNOME การยกเลิกการต่อเชื่อมผ่าน Nautilus จะแสดงข้อความที่ระบุว่ากระบวนการใดที่ยังใช้งานไดรฟ์อยู่และไฟล์ที่ใช้อยู่
สำหรับ 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
จะแสดงเชลล์ซึ่งไดเรกทอรีปัจจุบันใช้อุปกรณ์นั้น คุณอาจต้องการ su ในฐานะผู้ใช้นั้นอีกครั้งเพื่อเปลี่ยนไดเรกทอรีของคุณ