Đôi khi, tôi muốn unmount một thiết bị USB với umount /run/media/theDrive
, nhưng tôi nhận được một drive is busy
lỗi.
Làm cách nào để biết quy trình hoặc chương trình nào đang truy cập vào thiết bị?
Đôi khi, tôi muốn unmount một thiết bị USB với umount /run/media/theDrive
, nhưng tôi nhận được một drive is busy
lỗi.
Làm cách nào để biết quy trình hoặc chương trình nào đang truy cập vào thiết bị?
Câu trả lời:
Sử dụng lsof | grep /media/whatever
để tìm hiểu những gì đang sử dụng gắn kết.
Ngoài ra, hãy xem xét umount -l
(lười biếng) để ngăn chặn các quá trình mới sử dụng ổ đĩa trong khi bạn dọn dẹp.
fuser -mv /path/to/mountpoint
có thể là một sự thay thế dễ đọc hơn để tìm ra các quy trình sử dụng một điểm chính.
lsof | grep
hoạt động tốt hơn đối với tôi. fuser -mv
dường như chỉ đổ hơn 80 quy trình không liên quan. Tôi đang sử dụng thư mục gắn kết gắn kết.
umount -l
là nguy hiểm . thay vào đó, mount -o bind
một 000
thư mục trống chế độ và dọn dẹp thông qua lsof +f -- /dev/device
.
Hầu hết thời gian, lệnh tốt nhất để sử dụng là lsof (Dịch l i s t o pen f iles tựa).
lsof +f -- /media/usb0
nơi /media/usb0
là mount point của ổ đĩa USB hoặc hệ thống tập tin khác để ngắt kết nối. +f --
nói với lsof để coi đối số tiếp theo là điểm gắn kết; nó thường, nhưng không phải luôn luôn, tự quản lý, do đó lsof /media/usb0
cũng hoạt động. Điều này tìm thấy các tệp đang mở (ngay cả những tệp không được liên kết), các tệp ánh xạ bộ nhớ, thư mục hiện tại và một số cách sử dụng tối nghĩa hơn. Bạn sẽ cần chạy lệnh với quyền root để lấy thông tin về các quy trình của người dùng khác (và tôi nghĩ rằng có những thông báo lsof
phải được chạy dưới quyền root).
Có những công dụng mà lsof sẽ không tìm thấy; đây là không phổ biến trên phương tiện di động. Chúng bao gồm:
/foo
nếu /foo/bar
là điểm gắn kết./foo
nếu /foo/bar
là thiết bị khối gắn kết hoặc tệp thông thường được gắn vòng lặp hoặc nếu đó là nguồn của giá trị gắn kết Linux.Một lệnh khác có thể phục vụ trong một nhúm là fuser, chỉ liệt kê các quy trình PID với các tệp đang mở trên thiết bị:
fuser -m /media/usb0
Bạn có thể sử dụng lsof
như Peter đã nói, hoặc nếu bạn chắc chắn rằng bạn chỉ muốn giết tất cả những thứ đó và gỡ bỏ nó, bạn có thể có thể làm một cái gì đó như:
fuser -Mk /mnt/path
umount /mnt/path
-M
cho an toàn.
-M
sẽ được áp dụng.
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.
Các quy trình với các tệp đang mở là thủ phạm thông thường. Hiển thị chúng:
lsof +f -- <mountpoint or device>
Có một lợi thế cho việc sử dụng /dev/<device>
hơn là /mountpoint
: một điểm gắn kết sẽ biến mất sau một umount -l
hoặc có thể bị ẩn bởi một giá treo.
fuser
cũng có thể được sử dụng, nhưng theo tôi thì lsof
có một đầu ra hữu ích hơn. Tuy nhiên fuser
rất hữu ích khi nói đến việc tiêu diệt các quá trình gây ra các bộ phim truyền hình của bạn để bạn có thể tiếp tục cuộc sống của mình.
Liệt kê các tập tin trên <mountpoint>
(xem cảnh báo ở trên):
fuser -vmM <mountpoint>
Chỉ giết tương tác các quá trình với các tệp được mở để ghi:
fuser -vmMkiw <mountpoint>
Sau khi đếm lại chỉ đọc ( mount -o remount,ro <mountpoint>
), an toàn (r) để giết tất cả các quy trình còn lại:
fuser -vmMk <mountpoint>
Thủ phạm có thể là chính hạt nhân. Một hệ thống tập tin khác được gắn trên hệ thống tập tin mà bạn đang cố gắng umount
sẽ gây ra đau buồn. Kiểm tra với:
mount | grep <mountpoint>/
Đối với các mountback loopback ( cảm ơn Stephen Kitt ), cũng kiểm tra đầu ra của:
losetup -la
Các nút ẩn danh có thể được tạo bởi:
open
có O_TMPFILE
)Đây là những loại khó nắm bắt nhất của pokemon, và xuất hiện trong lsof
's TYPE
cột như a_inode
(được cung cấp tài liệu trong lsof
trang người đàn ông ).
Chúng sẽ không xuất hiện lsof +f -- /dev/<device>
, vì vậy bạn sẽ cần:
lsof | grep a_inode
Để tiêu diệt các quá trình giữ các nút ẩn danh, hãy xem: Liệt kê các đồng hồ inotify hiện tại (tên đường dẫn, PID) .
inotify
đồng hồ (Linux)Nhận xét này giải thích lý do tại sao inotify
không nên ngăn chặn việc không đếm được, nhưng ghi chú này mô tả các tình huống sẽ xảy ra :
một unmount có thể bị treo trong
vx_softcnt_flush()
cuộc gọi. Việc treo xảy ra do đồng hồ inotify làm tăngi_count
biến số và khiếnv_os_hold value
cho độ cao được duy trì cho đến khi trình theo dõi inotify giải phóng việc giữ.
lsof
.
Mountpoints
phần.
Đối với (ít nhất) OpenBSD:
$ fstat /mnt/mountpoint
Ví dụ: (sử dụng doas
để thực thi fstat
với quyền root như chúng ta sẽ chỉ thấy các quy trình của riêng mình):
$ 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/
Trong trường hợp này, tôi sẽ không thể ngắt kết nối /usr/ports
cho đến khi người dùng _pbuild
đã chạy xong hai make
quy trình đó.
Đây là một cạm bẫy phổ biến: Bạn su cho một người dùng khác (hoặc root hoặc bất kỳ người dùng nào khác), thay đổi thư mục của một thiết bị được gắn kết, sau đó đăng xuất với tư cách là người dùng đó. Khi bạn quên rằng bạn đã để lại trong thư mục đó, bạn có thể thử và tìm cho đến khi bạn bị mù. lsof
không hiển thị shell mà thư mục hiện tại đang sử dụng thiết bị đó. Bạn có thể muốn su làm người dùng đó một lần nữa để thay đổi thư mục của bạn.