FUSE và quyền truy cập của nó
lsof
theo mặc định, kiểm tra tất cả các hệ thống tệp được gắn kết bao gồm FUSE - hệ thống tệp được triển khai trong không gian người dùng có quyền truy cập đặc biệt trong Linux.
Như bạn có thể thấy trong câu trả lời này trên Hỏi Ubuntu, hệ thống tệp GVFS được gắn (trường hợp đặc biệt của FUSE) thường chỉ có thể truy cập đối với người dùng đã gắn nó (chủ sở hữu gvfsd-fuse
). Thậm chí root
không thể truy cập nó. Để ghi đè hạn chế này, có thể sử dụng các tùy chọn gắn kết allow_root
và allow_other
. Tùy chọn cũng phải được bật trong trình nền FUSE, ví dụ được mô tả trong câu trả lời này ... nhưng trong trường hợp của bạn, bạn không cần (và không nên) thay đổi quyền truy cập.
Không bao gồm các hệ thống tập tin từ lsof
Trong trường hợp của bạn lsof
không cần kiểm tra các hệ thống tệp GVFS để bạn có thể loại trừ các stat()
cuộc gọi trên chúng bằng -e
tùy chọn (hoặc bạn chỉ có thể bỏ qua cảnh báo):
lsof -e /run/user/1000/gvfs
Kiểm tra các tập tin nhất định bằng lsof
Bạn đang sử dụng lsof
để có được thông tin về tất cả các quy trình đang chạy trên hệ thống của mình và chỉ sau đó bạn mới lọc được đầu ra hoàn chỉnh bằng cách sử dụng grep
. Nếu bạn muốn kiểm tra chỉ một số tệp nhất định và các quy trình liên quan, hãy sử dụng -f
tùy chọn không có giá trị trực tiếp theo sau đó chỉ định danh sách các tệp sau dấu phân cách "kết thúc tùy chọn" --
. Điều này sẽ nhanh hơn đáng kể.
lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv
Giải pháp chung
Để loại trừ tất cả các hệ thống tệp được gắn mà stat()
không thành công, bạn có thể chạy một cái gì đó như thế này (trong bash
):
x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv
Hoặc để chắc chắn sử dụng stat()
( test -e
có thể được thực hiện theo một cách khác):
x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done
lsof
(không có|
và grep) không?