Hangi sürecin umountu önlediğini nasıl anlarım?

22

Yaptığımda

sudo umount /media/KINGSTON

Anladım

umount: /media/KINGSTON: device is busy.

Tüm pencereleri kapatıyorum ve tüm kabukların diğer dizinlere işaret ettiğinden emin oluyorum. Hangi süreci umountu önlediğini nasıl bulabilirim?

    
sordu Guillaume Coté 06.11.2010 08:25

4 cevap

21

bir terminali açın:

fuser -c /media/KINGSTON

Bunun gibi bir şey çıkacak:

/media/KINGSTON/: 3106c 11086

Bu, bu birimi kullanan işlemlerin pidini verecektir. Pid'in sonundaki ekstra karakter, bazı ekstra bilgi verecektir. (3106c'de c)

c - süreç dosyayı geçerli çalışma dizini olarak kullanıyor
m - dosya mmap ile eşleştirilmiştir
o - süreç bunu açık bir dosya olarak kullanıyor
r - dosya, sürecin kök dizinidir
t - işlem dosyaya bir metin dosyası olarak erişiyor
y - bu dosya, sürecin kontrol terminalidir

Öyleyse, o dökümleri kaldırmak ve tekneyi yeniden denemek için

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

Not: Bu başvuruların tam adını bulmak için bu komutu kullanabilirsiniz

cat /proc/<pid>/cmdline

Örneğin: cat /proc/11086/cmdline

Bu, aşağıdakine benzer bir sonuç verecektir.

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

Bunun yardımcı olacağını umarım

    
verilen cevap aneeshep 06.11.2010 09:01
7

En kullanışlı araç lsof şeklindedir. . Hangi dosyaların hangi işlemlerle kullanıldığını gösterir. % Co_de% bir bağlama noktasıysa (aygıt adı da çalışır), aşağıdaki komut, bu bağlama noktasında kullanılan tüm dosyaları gösterir:

lsof /media/KINGSTON

Bu komutu sıradan bir kullanıcı olarak çalıştırırsanız, yalnızca kendi işlemlerinizi gösterecektir. Tüm kullanıcıların işlemlerini görmek için /media/KINGSTON çalıştırın.

sudo lsof /media/KINGSTON 'sindeki çıktı şuna benzer:

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

lsof sütunu, program yürütülebilir dosyasının adını gösterir ve COMMAND sütunu işlem kimliğini gösterir. % Co_de% sütunu dosya adını gösterir; Dosya açıkken silinmişse PID 'yi görebilirsiniz (bir dosya silindiğinde, artık bir ismi yoktur, ancak bunu kullanan son işlem, dosyayı kapatıncaya kadar devam eder). NAME kendiliğinden açıklayıcı olmalıdır. Diğer sütunlar, dosyanın işlem tarafından nasıl kullanıldığını gösteren (deleted) dışında burada önemli değildir:

  • USER : geçerli çalışma dizini
  • FD : program çalıştırılabilir²
  • cwd : bellek eşlemeli bir dosya (burada, açık dosya olarak düşünün)
  • bir sayı: gerçek bir açık dosya; Sonraki harf, okuma için txt ve yazma için mem gibi açılış modunu gösterir.

Bir dosyanın açık olduğu pencereyi bulmak için mekanik bir yol yoktur (bu aslında teknik olarak anlamlı değildir: bir işlem birkaç pencereye sahipse, bir dosya özellikle bir pencere veya başka biriyle ilişkili değilse), hatta herhangi bir basit Bir sürecin penceresini belirleme yolu (ve tabii ki bir işlemin herhangi bir penceresinin olması gerekmez). Ancak genellikle komut adı ve dosya adı suçluyu bulmak ve dosyayı düzgün bir şekilde kapatmak için yeterlidir.

Dosyayı kapatamaz ve yalnızca tümünü sonlandırmak isterseniz, işlemi r (burada w işlem kimliği) veya kill 31421 (“asmak”) ile öldürebilirsiniz. Düz öldürme hile yapmazsa, aşırı önyargı ile öldürün: 31421 .

lsof için bir GUI var, glsof , ancak henüz prime time için henüz hazır değil ve Ubuntu için şimdiye kadar paketlenmiş.

¹ Lsof, diğer kullanıcıların işlemleriyle ilgili bazı bilgileri listeleyebilir, ancak bağlama noktasını algılamaz, böylece bir bağlama noktası belirtirseniz bunları listelemez.
² Yürütülebilir kod, genellikle yürütülebilir biçimlerdeki tartışmalarda metin olarak adlandırılır.

    
verilen cevap Gilles 06.11.2010 13:59
2

Ayrıca bu yardımcı olabilir:

lsof | grep \/media\/KINGSTON
    
verilen cevap Hashem Masoud 06.11.2010 09:02
2

Bu arada, füzer komutu çok gelişti. Tam işi tek bir komutla yapabilirsiniz:

sudo fuser -ickv /"mountpoint"

Burada:

  • k parametresi hatalı işlemi öldürüyor,
  • v , işlemi ve kullanıcısını önceden gösterirken
  • ve i , onayınızı ister.

Bazı süreçler dirençliyse, en inatçı olanları öldüren fuser -ickv -9 (veya daha genel olarak -SIGNAL ile) ile tekrar deneyin.
Ama her zaman "ölümsüz" bir süreç bulacaksın!

    
verilen cevap prometheos 14.01.2016 01:56

Etiketlerdeki diğer soruları oku