Kadang-kadang, saya ingin mencopot perangkat usb dengan umount /run/media/theDrive
, tapi saya mendapatkan drive is busy
error.
Bagaimana cara mengetahui proses atau program mana yang mengakses perangkat?
Kadang-kadang, saya ingin mencopot perangkat usb dengan umount /run/media/theDrive
, tapi saya mendapatkan drive is busy
error.
Bagaimana cara mengetahui proses atau program mana yang mengakses perangkat?
Jawaban:
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.
fuser -mv /path/to/mountpoint
mungkin menjadi alternatif yang lebih mudah dibaca untuk mengetahui proses menggunakan titik moint.
lsof | grep
bekerja lebih baik untuk saya. fuser -mv
tampaknya hanya membuang 80+ proses yang tidak terkait. Saya menggunakan direktori mount binded.
umount -l
berbahaya . direktori mount -o bind
mode 000
kosong di atas, dan bersihkan melalui lsof +f -- /dev/device
.
Sebagian besar waktu, perintah terbaik untuk digunakan adalah lsof ( “ l i s t o pen f iles”).
lsof +f -- /media/usb0
di mana /media/usb0
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 yang 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
merupakan mount point./foo
jika /foo/bar
merupakan 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
Anda dapat menggunakan lsof
seperti yang Peter katakan, atau jika Anda yakin ingin membunuh semua hal itu dan melepasnya, Anda mungkin dapat melakukan sesuatu seperti:
fuser -Mk /mnt/path
umount /mnt/path
-M
untuk keamanan.
-M
harus diterapkan.
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.
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
Inode anonim dapat dibuat oleh:
open
dengan O_TMPFILE
)Ini adalah jenis yang paling sulit dipahami dari pokemon, dan muncul di lsof
's TYPE
kolom sebagai a_inode
(yang didokumentasikan di lsof
halaman manual ).
Mereka tidak akan muncul lsof +f -- /dev/<device>
, jadi Anda harus:
lsof | grep a_inode
Untuk mematikan proses yang menyimpan inode anonim, lihat: Daftar jam tangan yang tidak berizin 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 :
sebuah unmount dapat bertahan dalam
vx_softcnt_flush()
panggilan. Gantung terjadi karena jam tangan yang tidak dinotifikasi menambahi_count
variabel dan menyebabkannyav_os_hold value
tetap tinggi sampai pengamat yang tidak memberi tahu melepaskan penangguhan.
lsof
.
Mountpoints
bagian.
Untuk (setidaknya) OpenBSD:
$ fstat /mnt/mountpoint
Sebagai contoh (menggunakan doas
untuk mengeksekusi fstat
sebagai root karena jika tidak kita hanya akan melihat proses kita 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
selesai menjalankan kedua make
proses tersebut.
Ini adalah perangkap umum: Anda su ke pengguna yang berbeda (baik root atau pengguna lain), ubah ke direktori perangkat yang dipasang, dan kemudian logout sebagai pengguna itu. Ketika Anda lupa bahwa Anda pergi di direktori itu, Anda dapat mencoba dan menemukan sampai Anda buta. lsof
tidak menunjukkan shell direktori saat ini yang menggunakan perangkat itu. Anda mungkin ingin su sebagai pengguna itu lagi untuk mengubah direktori Anda.