Các lựa chọn thay thế cho lệnh của lsof


20

Trong nhiều trường hợp "lsof" không được cài đặt trên các máy mà tôi phải làm việc, nhưng "chức năng" của lsof sẽ rất cần thiết (ví dụ trên AIX). : \

Có bất kỳ "lsof" nào giống như các ứng dụng trong thế giới không có cửa sổ không?

CẬP NHẬT: ví dụ: Tôi cần biết rằng quy trình nào sử dụng thư mục "/ home / username"?


1
Bạn có thể cụ thể hơn, xin vui lòng? Bạn có ý tưởng gì về hệ thống ngoài AIX (được hỗ trợ bởi lsof)? Hoặc chỉ có một loại sử dụng cụ thể của lsof bạn có trong tâm trí? Nói chung: tại sao không lsof?
rozcietrzewiacz

Tôi đang sử dụng Linux 2.6.18-92.el5 GNU và tôi không có lsof, tôi cũng không có khả năng sử dụng lsof :(
SSH

Câu trả lời:


20

Tôi biết fuser, xem nếu có sẵn trên hệ thống của bạn.


Tôi phải làm gì để cung cấp fuser làm tham số để liệt kê tất cả các tệp đang mở trên một hệ thống? : Ôi ty!
LanceBaynes

2
Lệnh sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lesscó thể hiển thị tất cả các quy trình có tệp đang mở trên hệ thống tệp được gắn trên /. Xem trang người đàn ông để được giúp đỡ cụ thể.
enzotib

TY! nó cung cấp đầu ra như thế này: pastebin.com/raw.php?i=2z19g6Rk - tôi đã googled cho nó, nhưng tôi không thể tìm thấy bất kỳ cách nào để xuất ra ex.: "gnome-Screensaver", không phải "gnome-Screensav" - vì vậy Làm thế nào tôi có thể xuất nó với tên lệnh rộng? : O
LanceBaynes

nó cung cấp cùng một đầu ra cho: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes

Một cái gì đó như thế này:sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | while read user pid flags rest; do printf '%10s %10s %10s %s\n' $user $pid $flags "$(</proc/$pid/cmdline)"; done | less
enzotib

15

Các Unix Rosetta Stone là một nguồn lực tốt cho các loại hình câu hỏi. Nó đề cập đến một vài lựa chọn thay thế cho lsof (xem bên dưới). Tuy nhiên, xin lưu ý rằng lsof là ứng dụng tiêu chuẩn thực tế cho những gì nó làm.

Nếu tất cả những gì bạn muốn là tìm (các) ID tiến trình có một tệp cụ thể đang mở, thì bạn có thể sử dụng fusertrên bất kỳ hệ thống tuân thủ POSIX nào.

Trên các hệ điều hành có một /procthư mục, bạn có thể truy vấn các tệp được mở bằng một quy trình (ngược lại với lsofchế độ hoạt động phổ biến nhất) thông qua thông tin trong /proc. Một số hệ điều hành có các lệnh cho điều đó:


8

Nếu bạn tình cờ chạy Solaris, một giải pháp thay thế lsof, không được cài đặt theo mặc định và có thể gây nghẹt thở trên ZFS, là pfiles.

ví dụ:

pfiles /proc/*


2

Phiên bản của tôi, chỉ với một chút ít tiện ích chạy:

for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do \
    ls -l ${proc_pid}/fd 2>/dev/null \
    | grep -q "$search_term" \
    && echo "${proc_pid#/proc/}"; \
done

Phải thừa nhận rằng, nó có thể không xử lý tất cả các trường hợp góc, nhưng đang hoạt động trong trường hợp sử dụng của tôi.


0

Cái này cần phải dùng mẹo. Nó sẽ cung cấp cho tất cả các ánh xạ mô tả tệp ngoại trừ những ánh xạ:

  • bạn không được phép xem, hoặc
  • dành cho các tệp chứa chuỗi "Quyền bị từ chối"
( find /proc -mindepth 1 -maxdepth 1 \
  | grep -E [0-9]+ | xargs -n 1 -I% find %/fd \
  | xargs ls -l \
  | grep -v "Permission denied" ) 2>/dev/null \
| cut -d' ' -f12- | less

Nếu bạn đã biết bạn chỉ quan tâm đến ánh xạ cho một số chương trình nhất định, thay vào đó bạn có thể sử dụng một cái gì đó nhiều hơn dọc theo dòng:

exec=sshd
pgrep "$exec" | xargs -n 1 ps -p
pgrep "$exec" | xargs -n 1 -I% find /proc/%/fd | xargs ls -l | cut -d' ' -f12- | less

-2

Đôi khi lsofđược cài đặt trong/usr/sbin

Nếu /usr/sbinkhông phải là một phần của bạn $PATH, bạn có thể bỏ lỡ lệnh thậm chí được cài đặt.

Kiểm tra nó với

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz

OP nói rằng lsof chưa được cài đặt và yêu cầu thay thế ...
Jeff Schaller
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.