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?
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?
Câu trả lời:
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
ps <pid>
thay vì chỉnh sửa các tệp trong / Proc để xem tên lệnh và đối số.
Công cụ hữu ích nhất là lsof . Nó cho thấy các tập tin được sử dụng bởi các quá trình. Nếu /media/KINGSTON
là đ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ừ lsof
trô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 COMMAND
chương trình cột tên của chương trình thực thi và các PID
chương trình cột quá trình ID. Các NAME
cộ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). USER
nê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ạitxt
: 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ở)r
để đọc và w
viếtKhô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
( 31421
ID 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.
Ngoài ra điều này có thể giúp:
lsof | grep \/media\/KINGSTON
grep "media/KINGSTON"
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:
k
giết chết quá trình vi phạm,v
hiển thị trước quá trình và người dùng của nói
yê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.
vboxmanage
. -_-