Bagaimana cara mengetahui proses mana yang mencegah umount?

26

Kapan saya melakukannya

sudo umount /media/KINGSTON

saya mendapatkan

umount: /media/KINGSTON: device is busy.

Saya menutup semua jendela dan memastikan semua shell menunjuk ke direktori lain. Bagaimana saya bisa menemukan proses mana yang mencegah umount?

Guillaume Coté
sumber
3
Saya pikir Anda sudah salah ketik di sini, saya ragu perintah itu kembali, "Bagaimana saya mengetahui proses mana yang memakan bandwidth saya?" ...;) ada kemungkinan Anda bisa mengedit pertanyaan itu?
8128

Jawaban:

24

buka terminal:

fuser -c /media/KINGSTON

Ini akan menampilkan sesuatu seperti ini:

/media/KINGSTON/: 3106c 11086

Ini akan memberi Anda pid dari proses menggunakan volume ini. Karakter tambahan di akhir pid akan memberikan beberapa info tambahan. (c dalam 3106c)

c - proses menggunakan file sebagai direktori kerja saat ini
m - file dipetakan dengan mmap
o - proses menggunakannya sebagai file terbuka
r - file adalah direktori root dari proses
t - proses mengakses file sebagai file teks
y - file ini adalah terminal pengendali untuk proses

Jadi untuk meng-unmount, matikan saja pids-nya dan coba lagi unmount

sudo kill -9 3106 11086
sudo umount /media/KINGSTON

Catatan: Untuk menemukan nama aplikasi persis dari pids ini, Anda dapat menggunakan perintah ini

cat /proc/<pid>/cmdline

Sebagai contoh : cat /proc/11086/cmdline

ini akan menampilkan sesuatu seperti di bawah ini.

    evince^@/media/KINGSTON/Ubuntu-guide.pdf^@

Semoga ini bisa membantu

aneeshep
sumber
2
fuser -ck juga akan membunuhnya.
João Pinto
3
Saya menyarankan untuk membunuh mereka tanpa opsi -9 terlebih dahulu, untuk memberikan aplikasi tersebut kesempatan untuk dimatikan secara bersih. Dan saya sarankan menggunakan ps <pid>daripada mengedit file di / proc untuk melihat nama perintah dan argumen.
Marius Gedminas
Saya mengikuti prosedur Anda untuk menemukan prosesnya, itu adalah Thunar - deamon. Tidak ada karakter tambahan yang memberikan info tambahan. Saya belum membunuhnya, saya mengkhawatirkan dampaknya pada hal lain yang berjalan.
Guillaume Coté
7

Alat yang paling berguna adalah lsof Instal lsof . Ini menunjukkan file apa yang digunakan oleh proses apa. Jika /media/KINGSTONadalah titik pemasangan (nama perangkat juga akan berfungsi), perintah berikut menunjukkan semua file yang digunakan pada titik pemasangan ini:

lsof /media/KINGSTON

Jika Anda menjalankan perintah ini sebagai pengguna biasa, itu hanya akan menunjukkan proses Anda sendiri¹. Jalankan sudo lsof /media/KINGSTONuntuk melihat semua proses pengguna.

Output dari lsofterlihat seperti ini:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
zsh4    31421 gilles  cwd    DIR    8,1     4096 130498 /var/tmp
zsh4    31421 gilles  txt    REG    8,1   550804 821292 /bin/zsh4
zsh4    31421 gilles  mem    REG    8,1    55176 821326 /usr/lib/zsh/4.3.10/zsh/complist.so
zsh4    31421 gilles   12r   REG    8,1   175224 822276 /usr/share/zsh/functions/Completion.zwc

The COMMANDkolom menunjukkan nama program dieksekusi dan PIDkolom menunjukkan proses ID. The NAMEkolom menunjukkan nama file; Anda mungkin melihat (deleted)apakah file itu dihapus saat terbuka (ketika file dihapus, itu tidak lagi memiliki nama, tetapi masih ada sampai proses terakhir menggunakannya menutup file). USERharus jelas. Kolom lain tidak penting di sini kecuali mungkin FD, yang menunjukkan bagaimana file digunakan oleh proses:

  • cwd: direktori kerja saat ini
  • txt: program executable²
  • mem: file yang dipetakan memori (di sini, anggap sebagai file terbuka)
  • a number: file terbuka aktual; huruf berikutnya menunjukkan mode pembuka, seperti runtuk membaca dan wmenulis

Tidak ada cara mekanis untuk menemukan jendela tempat file dibuka (ini sebenarnya tidak bermakna secara teknis: jika suatu proses memiliki beberapa jendela, file tidak secara khusus dikaitkan dengan satu jendela atau lainnya), atau bahkan tidak ada cara sederhana untuk mengidentifikasi jendela proses (dan tentu saja suatu proses tidak harus memiliki jendela apa pun). Tetapi biasanya nama perintah dan nama file sudah cukup untuk menemukan pelaku dan menutup file dengan benar.

Jika Anda tidak dapat menutup file dan hanya ingin mengakhiri semuanya, Anda dapat mematikan prosesnya dengan kill 31421(di mana 31421ID prosesnya) atau kill -HUP 31421("menutup telepon"). Jika pembunuhan polos tidak melakukan trik, membunuh dengan prasangka ekstrem: kill -KILL 31421.

Ada GUI untuk lsof, glsof , tetapi belum cukup siap untuk prime time, dan belum dikemas untuk Ubuntu sejauh ini.

¹ Lsof dapat mencantumkan beberapa informasi tentang proses pengguna lain, tetapi tidak mendeteksi titik pemasangan jadi tidak akan mencantumkannya jika Anda menetapkan titik pemasangan.
² Kode yang dapat dieksekusi sering disebut teks dalam diskusi format yang dapat dieksekusi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Ini juga dapat membantu:

lsof | grep \/media\/KINGSTON
Hashem Masoud
sumber
4
Tidak perlu melarikan diri dari tebasan.
Marius Gedminas
Ketika Anda tidak yakin, coba tebak dengan tanda kutip misalnyagrep "media/KINGSTON"
Adam Matan
2

Sementara itu, perintah fuser telah jauh meningkat. Anda dapat melakukan pekerjaan penuh dengan satu perintah:

$ sudo fuser -ickv /"mountpoint"

Dimana:

  • parameter kmembunuh proses yang menyinggung,
  • sementara vmenunjukkan terlebih dahulu proses dan penggunanya
  • dan imeminta Anda untuk konfirmasi.

Jika beberapa proses menolak, maka coba lagi dengan fuser -ickv -9(atau lebih umum dengan -SIGNAL) yang membunuh yang paling keras kepala.
Tetapi Anda akan selalu menemukan beberapa proses "abadi" ...!

Dalam kasus ini saya baru-baru ini belajar menggunakannya

$ sudo umount --lazy --force <mountpoint>

sebagai sumber terakhir, yang sampai sekarang bekerja untuk saya setiap saat.

prometheos
sumber
Saya menemukan proses abadi, upaya gagal saya untuk digunakan vboxmanage. -_-
sudo