it-swarm-vi.com

Làm cách nào để tìm ra quy trình nào đang ngăn chặn việc ngắt kết nối thiết bị?

Đôi khi, tôi muốn ngắt kết nối một thiết bị usb với umount /run/media/theDrive, Nhưng tôi gặp lỗi drive is busy.

Làm cách nào để biết quy trình hoặc chương trình nào đang truy cập thiết bị?

70
Stefan

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.

70
Peter Eisentraut

Hầu hết thời gian, lệnh tốt nhất để sử dụng là lsof (Số l i s t o bút f iles phạm).

lsof +f -- /media/usb0

ở đâu /media/usb0 là điểm gắn kết của ổ USB hoặc hệ thống tập tin khác để ngắt kết nối. +f -- bảo lsof coi đối số tiếp theo là điểm gắn kết; nó thường, nhưng không phải lúc nào cũng tự quản lý, sao cho 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), 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ĩ có những thông báo trong đó 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; những điều này là không phổ biến trên phương tiện di động. Chúng bao gồm:

  • điểm gắn kết: bạn không thể ngắt kết nối /foo nếu /foo/bar là một điểm gắn kết.
  • gắn thiết bị: bạn không thể ngắt kết nối /foo nếu /foo/bar là một thiết bị khối gắn kết hoặc tệp thông thường gắn trên vòng lặp hoặc nếu đó là nguồn của liên kết gắn kết Linux.
  • Xuất NFS: lsof sẽ không phát hiện ra rằng cây được xuất bởi máy chủ NFS kernel.

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
37

Mở tập tin

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ế khi sử dụng /dev/<device> Chứ không phải /mountpoint: Một điểm gắn kết sẽ biến mất sau khi umount -l, Hoặc nó 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ó đầu ra hữu ích hơn. Tuy nhiên fuser rất hữu ích khi giết chế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 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>), Sẽ an toàn (r) để giết tất cả các quy trình còn lại:

fuser -vmMk <mountpoint>

Đỉnh núi

Thủ phạm có thể là chính hạt nhân. Một hệ thống tệp khác được gắn trên hệ thống tệp mà bạn đang cố gắng umount sẽ gây đ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

Inodes nặc danh (Linux)

Nút ẩn danh có thể được tạo bởi:

  • Các tệp tạm thời (open với O_TMPFILE)
  • inotify đồng hồ
  • [sự kiện]
  • [sự kiện]
  • [hẹn giờ]

Đây là loại pokemon khó nắm bắt nhất và xuất hiện trong cột lsof 's TYPE dưới dạng a_inode (Không được ghi trong trang man lsof man ).

Chúng sẽ không xuất hiện trong lsof +f -- /dev/<device>, Vì vậy bạn sẽ cần:

lsof | grep a_inode

Để giế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 trong đó sẽ :

một unmount có thể bị treo trong cuộc gọi vx_softcnt_flush(). Việc treo xảy ra do đồng hồ inotify làm tăng biến i_count Và khiến v_os_hold value Duy trì ở mức cao cho đến khi trình theo dõi inotify giải phóng lệnh giữ.

9
Tom Hale

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à hủy kết nối nó, bạn có thể có thể làm một cái gì đó như:

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

Nếu bạn sử dụng Gnome, việc ngắt kết nối qua Nautilus sẽ hiển thị thông báo cho biết quá trình nào vẫn đang sử dụng ổ đĩa và tệp đang sử dụng.

alt text

5
tshepang

Đối với (ít nhất) OpenBSD:

$ fstat /mnt/mountpoint

Ví dụ: (sử dụng doas để thực thi fstat là 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 tiến trình make đó.

1
Kusalananda