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ị?


Câu trả lời:


58

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.


24
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.
Riccardo Murri

@RiccardoMurri 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.
Ricky Boyce

1
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.
Tom Hale

35

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:

  • điểm gắn kết: bạn không thể ngắt kết nối /foonếu /foo/barlà điểm gắn kết.
  • thiết bị gắn kết: bạn không thể ngắt kết nối /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.
  • 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

8

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

1
Nếu bạn sẽ làm điều này, xem xét sử dụng -Mcho an toàn.
Tom Hale

@TomHale Bạn có thể muốn làm rõ lệnh nào -Msẽ được áp dụng.
HSchmale

1
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.
Tom Hale

6

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ế 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>

Đỉnh núi

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

Inodes nặc danh (Linux)

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

  • Tệp tạm thời ( openO_TMPFILE)
  • đồng hồ inotify
  • [sự kiện]
  • [sự kiện]
  • [hẹn giờ]

Đâ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ăng i_countbiến số và khiến v_os_hold valuecho độ cao được duy trì cho đến khi trình theo dõi inotify giải phóng việc giữ.


Có một cái khác, mountback loopback: nếu bạn gắn một hệ thống tệp, sau đó gắn một tệp trên hệ thống tệp đó bằng mount loopback, bạn sẽ không thể ngắt kết nối hệ thống tệp đầu tiên, nhưng sẽ không có gì hiển thị lsof.
Stephen Kitt

Chúc mừng. Đã thêm vào Mountpointsphần.
Tom Hale

5

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.

văn bản thay thế


1

Đố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 đó.


-2

Đâ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.


2
Câu trả lời này không đầy đủ hoặc không chính xác. Tôi không chắc chắn điều đó bởi vì nó cũng không rõ ràng.
hildred
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.