it-swarm-id.com

Bagaimana cara mengetahui proses mana yang mencegah pelepasan perangkat?

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?

70
Stefan

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.

70
Peter Eisentraut

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:

  • mount points: Anda tidak dapat meng-unmount /foo jika /foo/bar adalah titik mount.
  • pasang perangkat: Anda tidak dapat melepas gunung /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.
  • 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

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.

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>

Mountpoints

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

Anonim inode dapat dibuat oleh:

  • File sementara (open dengan O_TMPFILE)
  • inotify jam tangan
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Ini adalah jenis pokemon yang paling sulit dipahami, dan muncul di kolom lsofTYPE 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 variabel i_count Dan menyebabkan v_os_hold value Tetap tinggi hingga pengawas inotify melepaskan penangguhan.

9
Tom Hale

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
8
pioto

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

alt text

5
tshepang

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.

1
Kusalananda