Làm cách nào để tìm ra quá trình nào đang sử dụng tệp trong Linux?


91

Tôi đã cố gắng xóa một tệp trong Linux bằng cách sử dụng rm -rf file_name, nhưng gặp lỗi:

rm: file_name not removed.  Text file busy

Làm cách nào để biết quy trình nào đang sử dụng tệp này?

Câu trả lời:


136

Bạn có thể sử dụng fuserlệnh, như:

fuser file_name

Bạn sẽ nhận được danh sách các quy trình sử dụng tệp.

Bạn có thể sử dụng các cờ khác nhau với nó, để nhận được kết quả chi tiết hơn.

Bạn có thể tìm thêm thông tin trong bài viết Wikipedia của bộ điều khiển hoặc trong các mantrang.


Tôi đã thử điều này: fuser -i / home / bin / lib. Nhưng nhận điều này: fuser: Tùy chọn bất hợp pháp - i / home / bin / lib: 27674t
khris

1
@khris, có thể là không phải tất cả các fusertriển khai đều giống nhau hoặc hoạt động theo cùng một cách. Ngay cả khi -iđược định nghĩa trong POSIX, việc triển khai cụ thể mà bạn đang sử dụng không nhất thiết phải có các tùy chọn giống như các tùy chọn được mô tả trong bài viết Wikipedia. Ví dụ: tôi đang sử dụng AIX ngay bây giờ và tính năng fusercó sẵn trong hệ thống này cũng không có -itùy chọn.
jimm-cl

Vì một số lý do, tôi fusercũng không lsoflàm việc với khách hộp thư ảo. Câu trả lời này đã cứu tôi.
kael

34

Câu trả lời của @ jim là đúng - fuserlà những gì bạn muốn.

Ngoài ra (hoặc thay thế), bạn có thể sử dụng lsofđể lấy thêm thông tin bao gồm tên người dùng, trong trường hợp bạn cần quyền (mà không cần phải chạy lệnh bổ sung) để hủy quá trình. (Tất nhiên, nếu việc giết quá trình là điều bạn muốn, fusercó thể làm điều đó với -ktùy chọn của nó . Bạn có thể fusersử dụng các tín hiệu khác với -stùy chọn - hãy kiểm tra trang người đàn ông để biết chi tiết.)

Ví dụ, với tail -F /etc/passwdviệc chạy trong một cửa sổ:

ghoti@pc:~$ lsof | grep passwd
tail      12470    ghoti    3r      REG  251,0     2037 51515911 /etc/passwd

Lưu ý rằng bạn cũng có thể sử dụng lsofđể tìm hiểu những quy trình đang sử dụng các ổ cắm cụ thể. Một công cụ tuyệt vời để có trong kho vũ khí của bạn.


trường nào là PID?
nmz787

@ nmz787 - lsof | head -1để xem tất cả các tiêu đề.
ghoti

@ nmz787 Trường thứ hai là PID.
cho

lsof | grep -E "PID|<your_process_name>"hiển thị cả dòng đầu tiên và quá trình bạn muốn truy vấn.
Robin Hsu

0
$ lsof | tree MyFold

Như trong hình ảnh đính kèm:

nhập mô tả hình ảnh ở đây


1
Cái này hoạt động ra sao? Có treeđọc gì từ stdin không? Nếu có, nó sẽ làm gì với đầu vào đó?
dyp

man lsof - hiển thị hướng dẫn sử dụng lệnh lsof, lsof - liệt kê các tệp đang mở, danh sách trên tệp đầu ra tiêu chuẩn của nó thông tin về tệp được mở bởi các quy trình và kết quả có thể nhìn thấy trong cấu trúc cây. bạn nên kiểm tra rõ ràng lsof là gì
Blunt Notion

Câu hỏi của tôi là về tree, không phải lsof. Theo như tôi hiểu, treekhông đọc từ đầu vào tiêu chuẩn, do đó sản lượng lsofđược loại bỏ khi bạn chạy lsof | tree .... Nếu điều đó đúng, thì lsof | tree MyFoldcũng giống như tree MyFold, chỉ hiển thị nội dung nhưng không hiển thị tệp nào được mở bởi một số quy trình.
dyp
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.