Terkadang, saya ingin meng-unmount a perangkat usb dengan umount /run/media/theDrive
, tapi saya mendapatkan drive is busy
kesalahan.
Bagaimana cara mengetahui proses atau program mana yang mengakses perangkat?
Gunakan lsof | grep /media/whatever
untuk mencari tahu apa yang menggunakan mount.
Juga pertimbangkan umount -l
(lazy umount) untuk mencegah proses baru menggunakan drive saat Anda membersihkan.
Sebagian besar waktu, perintah terbaik untuk digunakan adalah lsof (“ l i s t o pena f iles ”).
lsof +f -- /media/usb0
dimana /media/usb0
adalah titik pemasangan drive USB atau sistem file lain untuk dilepas. +f --
memberitahu lsof untuk memperlakukan argumen selanjutnya sebagai mount point; biasanya, tetapi tidak selalu, mengelola sendiri, sehingga lsof /media/usb0
juga berfungsi. Ini menemukan file yang terbuka (bahkan yang tidak terhubung), file yang dipetakan memori, direktori saat ini, dan beberapa penggunaan yang lebih tidak jelas. Anda harus menjalankan perintah sebagai root untuk mendapatkan informasi tentang proses pengguna lain (dan saya pikir ada beberapa kesatuan di mana lsof
harus dijalankan sebagai root).
Ada kegunaan yang tidak akan ditemukan oleh lsof; ini jarang terjadi pada media yang dapat dipindahkan. Mereka termasuk:
/foo
jika /foo/bar
adalah titik mount./foo
jika /foo/bar
adalah perangkat blok yang di-mount atau file biasa yang di-mount-loop, atau jika itu adalah sumber dari bind mount Linux.Perintah lain yang dapat disajikan dalam keadaan darurat adalah fuser, yang hanya mencantumkan PID proses dengan file yang terbuka di perangkat:
fuser -m /media/usb0
Proses dengan file terbuka adalah biang keladinya. Perlihatkan mereka:
lsof +f -- <mountpoint or device>
Ada keuntungan menggunakan /dev/<device>
Daripada /mountpoint
: Mountpoint akan hilang setelah umount -l
, Atau mungkin disembunyikan oleh mount overlay.
fuser
juga dapat digunakan, tetapi menurut saya lsof
memiliki output yang lebih berguna. Namun fuser
berguna untuk membunuh proses yang menyebabkan drama Anda sehingga Anda dapat melanjutkan hidup Anda.
Daftar file di <mountpoint>
(Lihat peringatan di atas):
fuser -vmM <mountpoint>
Hanya membunuh proses secara interaktif dengan file yang terbuka untuk ditulis:
fuser -vmMkiw <mountpoint>
Setelah menghitung ulang read-only (mount -o remount,ro <mountpoint>
), Aman (r) untuk mematikan semua proses yang tersisa:
fuser -vmMk <mountpoint>
Pelakunya bisa menjadi kernel itu sendiri. Filesystem lain yang terpasang pada filesystem yang Anda coba umount
akan menyebabkan kesedihan. Periksa dengan:
mount | grep <mountpoint>/
Untuk pemasangan loopback ( terima kasih Stephen Kitt ), periksa juga output dari:
losetup -la
Anonim inode dapat dibuat oleh:
open
dengan O_TMPFILE
)Ini adalah jenis pokemon yang paling sulit dipahami, dan muncul di kolom lsof
TYPE
sebagai a_inode
(Yang tidak didokumentasikan dalam lsof
halaman manual ).
Mereka tidak akan muncul di lsof +f -- /dev/<device>
, Jadi Anda harus:
lsof | grep a_inode
Untuk membunuh proses yang memegang inode anonim, lihat: Sebutkan jam tangan yang tidak sah saat ini (pathname, PID) .
inotify
jam tangan (Linux)Komentar ini menjelaskan mengapa inotify
tidak boleh mencegah unmount, tetapi catatan ini menjelaskan situasi di mana ia akan :
unmount dapat digantung dalam panggilan
vx_softcnt_flush()
. Gantung terjadi karena inotify watches menambah variabeli_count
Dan menyebabkanv_os_hold value
Tetap tinggi hingga pengawas inotify melepaskan penangguhan.
Anda dapat menggunakan lsof
seperti kata Peter, atau jika Anda yakin ingin membunuh semua hal itu dan melepasnya, Anda mungkin dapat melakukan sesuatu seperti:
fuser -Mk /mnt/path
umount /mnt/path
Jika Anda menggunakan GNOME, unmount melalui Nautilus akan menampilkan pesan yang menyatakan proses mana yang masih menggunakan drive, dan file yang digunakannya.
Untuk (setidaknya) OpenBSD:
$ fstat /mnt/mountpoint
Misalnya (menggunakan doas
untuk menjalankan fstat
sebagai root karena jika tidak, kami hanya akan melihat proses kami sendiri):
$ 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/
Dalam hal ini, saya tidak akan dapat meng-unmount /usr/ports
sampai pengguna _pbuild
telah selesai menjalankan kedua _ make
proses tersebut.