Kadang-kadang, saya ingin mencopot perangkat usb dengan umount /run/media/theDrive, tapi saya mendapatkan drive is busyerror.
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 busyerror.
Bagaimana cara mengetahui proses atau program mana yang mengakses perangkat?
Jawaban:
Gunakan lsof | grep /media/whateveruntuk 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/mountpointmungkin menjadi alternatif yang lebih mudah dibaca untuk mengetahui proses menggunakan titik moint.
lsof | grepbekerja lebih baik untuk saya. fuser -mvtampaknya hanya membuang 80+ proses yang tidak terkait. Saya menggunakan direktori mount binded.
umount -lberbahaya . direktori mount -o bind mode 000kosong 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/usb0titik 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/usb0juga 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 lsofharus dijalankan sebagai root).
Ada kegunaan yang tidak akan ditemukan oleh lsof; ini jarang terjadi pada media yang dapat dipindahkan. Mereka termasuk:
/foojika /foo/barmerupakan mount point./foojika /foo/barmerupakan 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 lsofseperti 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
-Muntuk keamanan.
-Mharus 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.
fuserjuga dapat digunakan, tetapi menurut saya lsofmemiliki output yang lebih berguna. Namun fuserberguna 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 umountakan 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:
opendengan O_TMPFILE)Ini adalah jenis yang paling sulit dipahami dari pokemon, dan muncul di lsof's TYPEkolom sebagai a_inode(yang didokumentasikan di lsofhalaman 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_countvariabel dan menyebabkannyav_os_hold valuetetap tinggi sampai pengamat yang tidak memberi tahu melepaskan penangguhan.
lsof.
Mountpointsbagian.
Untuk (setidaknya) OpenBSD:
$ fstat /mnt/mountpoint
Sebagai contoh (menggunakan doasuntuk mengeksekusi fstatsebagai 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/portssampai pengguna _pbuildselesai menjalankan kedua makeproses 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. lsoftidak menunjukkan shell direktori saat ini yang menggunakan perangkat itu. Anda mungkin ingin su sebagai pengguna itu lagi untuk mengubah direktori Anda.