Đô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 busylỗ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 busylỗ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/mountpointcó 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 | grephoạt động tốt hơn đối với tôi. fuser -mvdườ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 -llà nguy hiểm . thay vào đó, mount -o bind một 000thư 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/usb0là 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/usb0cũ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 lsofphả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:
/foonếu /foo/barlà điểm gắn kết./foonếu /foo/barlà 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 lsofnhư 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
-Mcho an toàn.
-Msẽ đượ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 -lhoặc có thể bị ẩn bởi một giá treo.
fusercũng có thể được sử dụng, nhưng theo tôi thì lsofcó một đầu ra hữu ích hơn. Tuy nhiên fuserrấ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 umountsẽ 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:
opencó 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 TYPEcột như a_inode(được cung cấp tài liệu trong lsoftrang 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_countbiến số và khiếnv_os_hold valuecho độ cao được duy trì cho đến khi trình theo dõi inotify giải phóng việc giữ.
lsof.
Mountpointsphần.
Đối với (ít nhất) OpenBSD:
$ fstat /mnt/mountpoint
Ví dụ: (sử dụng doasđể thực thi fstatvớ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/portscho đến khi người dùng _pbuildđã chạy xong hai makequy 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ù. lsofkhô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.