Bagaimana cara mengetahui proses mana yang mencegah pelepasan perangkat?


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.


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

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

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.


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


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.


-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.


2
Jawaban ini tidak lengkap atau salah. Saya tidak yakin yang mana karena juga tidak jelas.
Hildred
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.