it-swarm-vi.com

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

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

21
LanceBaynes

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

21
enzotib

nix Rosetta Stone là một tài nguyên tốt cho loại câu hỏi này. 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 fuser trên bất kỳ hệ thống tuân thủ POSIX nào.

Trên các hệ điều hành có dấu /proc thư 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 từ chế độ hoạt động phổ biến nhất của lsof) thông qua thông tin trong /proc. Một số hệ điều hành có các lệnh cho điều đó:

Nếu bạn tình cờ chạy Solaris, một thay thế cho lsof, không được cài đặt theo mặc định và có thể bị sặc trên ZFS, là pfiles.

ví dụ:

pfiles /proc/*

8
jlliagre

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.

2
Bryce Schober

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ừ các á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
0
Parthian Shot