Bagaimana cara mengetahui proses mana yang mencegah pelepasan perangkat?

59

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?

Stefan
sumber
1
lebih banyak upvotes untuk pertanyaan / jawaban yang sama di sini: stackoverflow.com/questions/624154/…
Trevor Boyd Smith

Jawaban:

58

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.

Peter Eisentraut
sumber
24
fuser -mv /path/to/mountpointmungkin menjadi alternatif yang lebih mudah dibaca untuk mengetahui proses menggunakan titik moint.
Riccardo Murri
@RiccardoMurri lsof | grepbekerja lebih baik untuk saya. fuser -mvtampaknya hanya membuang 80+ proses yang tidak terkait. Saya menggunakan direktori mount binded.
Ricky Boyce
1
umount -lberbahaya . direktori mount -o bind mode 000kosong di atas, dan bersihkan melalui lsof +f -- /dev/device.
Tom Hale
35

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:

  • mount points: Anda tidak dapat meng-unmount /foojika /foo/barmerupakan mount point.
  • mount devices: Anda tidak dapat meng-unmount /foojika /foo/barmerupakan perangkat blok yang di-mount atau file biasa yang di-mount-loop, atau jika itu adalah sumber dari bind mount Linux.
  • Ekspor NFS: lsof tidak akan mendeteksi bahwa pohon diekspor oleh server NFS kernel.

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

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
pioto
sumber
1
Jika Anda akan melakukan ini, lihat menggunakan -Muntuk keamanan.
Tom Hale
@ TomHale Anda mungkin ingin menjelaskan perintah mana yang -Mharus diterapkan.
HSchmale
1
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.
Tom Hale
6

Buka file

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>

Mountpoints

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 (Linux)

Inode anonim dapat dibuat oleh:

  • File sementara ( opendengan O_TMPFILE)
  • batalkan jam tangan
  • [eventfd]
  • [eventpoll]
  • [timerfd]

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 menambah i_countvariabel dan menyebabkannya v_os_hold valuetetap tinggi sampai pengamat yang tidak memberi tahu melepaskan penangguhan.

Tom Hale
sumber
Ada satu lagi, mountbackbacks: jika Anda me-mount sistem file, kemudian me-mount file pada sistem file menggunakan loopback mount, Anda tidak akan dapat meng-unmount sistem file pertama, tetapi tidak ada yang muncul di lsof.
Stephen Kitt
Tepuk tangan. Ditambahkan ke Mountpointsbagian.
Tom Hale
5

Jika Anda menggunakan GNOME, unmount melalui Nautilus akan menampilkan pesan yang menyatakan proses mana yang masih menggunakan drive, dan file yang digunakannya.

teks alternatif

tepang
sumber
1

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.

Kusalananda
sumber
-2

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.

Hans Linkels
sumber
2
Jawaban ini tidak lengkap atau salah. Saya tidak yakin yang mana karena juga tidak jelas.
Hildred