Làm thế nào để tôi tìm ra quá trình ngăn chặn một umount?


26

Khi tôi làm

sudo umount /media/KINGSTON

tôi đã nhận

umount: /media/KINGSTON: device is busy.

Tôi đóng tất cả các cửa sổ và đảm bảo tất cả các shell đang trỏ đến các thư mục khác. Làm thế nào tôi có thể tìm thấy quá trình ngăn chặn umount?


3
Tôi nghĩ rằng bạn đã có một lỗi đánh máy ở đây, tôi nghi ngờ lệnh đó đã trả về "Làm thế nào để tôi biết được quá trình nào đang ăn hết băng thông của tôi?" ...;) bất kỳ cơ hội nào bạn có thể chỉnh sửa câu hỏi?
8128

Câu trả lời:


24

mở một thiết bị đầu cuối:

fuser -c /media/KINGSTON

Nó sẽ xuất ra một cái gì đó như thế này:

/media/KINGSTON/: 3106c 11086

Điều này sẽ cung cấp cho bạn pid của các quá trình sử dụng khối lượng này. Ký tự phụ ở cuối pid sẽ cung cấp thêm một số thông tin. (c trong 3106c)

c - quá trình đang sử dụng tệp làm thư mục làm việc hiện tại của nó
m - tệp được ánh xạ với mmap
o - quá trình đang sử dụng nó dưới dạng tệp mở
r - tệp là thư mục gốc của quy trình
t - quá trình đang truy cập vào tệp dưới dạng tệp văn bản
y - tệp này là thiết bị đầu cuối kiểm soát cho quá trình

Vì vậy, để unmount chỉ cần giết pids đó và thử lại unmount

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

Lưu ý: Để tìm tên ứng dụng chính xác của các pids này, bạn có thể sử dụng lệnh này

cat /proc/<pid>/cmdline

Ví dụ : cat /proc/11086/cmdline

Điều này sẽ tạo ra một cái gì đó như dưới đây.

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

Hy vọng điều này sẽ giúp


2
fuser -ck cũng sẽ giết nó.
João Pinto

3
Tôi sẽ đề nghị tiêu diệt chúng mà không có tùy chọn -9 trước, để cho các ứng dụng đó có cơ hội tắt sạch. Và tôi sẽ đề nghị sử dụng ps <pid>thay vì chỉnh sửa các tệp trong / Proc để xem tên lệnh và đối số.
Marius Gedminas

Tôi làm theo quy trình của bạn để tìm quy trình, đó là Thunar - deamon. Không có nhân vật phụ cho thêm thông tin. Tôi chưa giết nó, tôi lo lắng về tác động của nó đối với việc khác.
Guillaume Coté

7

Công cụ hữu ích nhất là lsof Cài đặt lsof . Nó cho thấy các tập tin được sử dụng bởi các quá trình. Nếu /media/KINGSTONlà điểm gắn kết (tên thiết bị cũng sẽ hoạt động), lệnh sau sẽ hiển thị tất cả các tệp đang được sử dụng trên điểm gắn kết này:

lsof /media/KINGSTON

Nếu bạn chạy lệnh này như một người dùng thông thường, nó sẽ chỉ hiển thị các quy trình của riêng bạn¹. Chạy sudo lsof /media/KINGSTONđể xem tất cả các quy trình của người dùng.

Đầu ra từ lsoftrông như thế này:

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

Các COMMANDchương trình cột tên của chương trình thực thi và các PIDchương trình cột quá trình ID. Các NAMEcột hiển thị tên tập tin; bạn có thể thấy (deleted)nếu tập tin bị xóa trong khi mở (khi một tập tin bị xóa, nó không còn có tên, nhưng nó vẫn tồn tại cho đến khi quá trình cuối cùng sử dụng nó đóng tập tin). USERnên tự giải thích. Các cột khác không quan trọng ở đây ngoại trừ có lẽ FD, cho thấy cách tệp được sử dụng bởi quy trình:

  • cwd: thư mục làm việc hiện tại
  • txt: chương trình thực thi²
  • mem: một tệp ánh xạ bộ nhớ (ở đây, nghĩ về nó như một tệp mở)
  • một số: một tập tin mở thực tế; một chữ cái tiếp theo chỉ ra chế độ mở, chẳng hạn như rđể đọc và wviết

Không có cách cơ học nào để xác định vị trí cửa sổ nơi mở tệp (thực tế điều này không có ý nghĩa về mặt kỹ thuật: nếu một quy trình có nhiều cửa sổ, một tệp không được liên kết đặc biệt với cửa sổ này hoặc cửa sổ khác), thậm chí không có cách nhận dạng đơn giản nào một cửa sổ của một quá trình (và tất nhiên một quá trình không phải có bất kỳ cửa sổ nào). Nhưng thông thường tên lệnh và tên tệp là đủ để xác định vị trí người vi phạm và đóng tệp đúng cách.

Nếu bạn không thể đóng tệp và chỉ muốn kết thúc tất cả, bạn có thể tắt tiến trình bằng kill 31421( 31421ID quá trình ở đâu) hoặc kill -HUP 31421(Hang treo lên trên). Nếu giết chết đơn giản không thực hiện được mánh khóe, hãy giết với định kiến ​​cực đoan : kill -KILL 31421.

Có một GUI cho lsof, glsof , nhưng nó chưa hoàn toàn sẵn sàng cho thời gian chính và chưa được đóng gói cho Ubuntu cho đến nay.

¹ lsof có thể liệt kê một số thông tin về các quá trình của người dùng khác, nhưng nó không phát hiện các điểm gắn kết như vậy sẽ không liệt kê chúng nếu bạn chỉ định một điểm gắn kết.
² Mã thực thi thường được gọi là văn bản trong các cuộc thảo luận về các định dạng thực thi.


2

Ngoài ra điều này có thể giúp:

lsof | grep \/media\/KINGSTON

4
Không cần phải thoát khỏi dấu gạch chéo.
Marius Gedminas

Khi bạn không chắc chắn, hãy grep với dấu ngoặc kép, ví dụgrep "media/KINGSTON"
Adam Matan

2

Trong khi đó lệnh fuser đã được cải thiện nhiều. Bạn có thể thực hiện toàn bộ công việc với một lệnh duy nhất:

$ sudo fuser -ickv /"mountpoint"

Ở đâu:

  • tham số kgiết chết quá trình vi phạm,
  • trong khi vhiển thị trước quá trình và người dùng của nó
  • iyêu cầu bạn xác nhận.

Nếu một số quá trình vẫn tồn tại, sau đó thử lại với fuser -ickv -9(hoặc nói chung hơn với -SIGNAL) sẽ giết chết những người cứng đầu nhất.
Nhưng bạn sẽ luôn tìm thấy một quá trình "bất tử" ...!

Trong trường hợp này gần đây tôi đã học cách sử dụng

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

như một nguồn tài nguyên cuối cùng, cho đến nay tôi làm việc cho tôi mọi lúc.


Tôi tìm thấy quá trình bất tử, nỗ lực thất bại của tôi để sử dụng vboxmanage. -_-
sudo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.