Alternatywy dla polecenia „lsof”?

20

W wielu przypadkach „lsof” nie jest instalowany na komputerach, z którymi muszę pracować, ale „funkcja” lsof byłaby bardzo potrzebna (np. W systemie AIX). : \

Czy są jakieś aplikacje typu „lsof” w świecie innym niż Windows?

AKTUALIZACJA: np .: muszę wiedzieć, że jakie procesy wykorzystują katalog „/ home / username”?

LanceBaynes
źródło
1
Czy mógłbyś być bardziej szczegółowy? Jakie systemy oprócz AIX (który jest zdecydowanie obsługiwany przez lsof) masz na myśli? Czy jest tylko jeden konkretny sposób korzystania z lsof? Ogólnie: dlaczego nie lsof?
rozcietrzewiacz
Używam GNU Linuksa 2.6.18-92.el5 i nie mam lsof, ani nie mam możliwości korzystania z lsof :(
SSH To
Powiązane pytanie: jak sprawdzić otwarty plik bez lsof
Stéphane Gourichon

Odpowiedzi:

20

Wiem o tym fuser, czy jest dostępny w twoim systemie.

enzotib
źródło
co muszę podać utrwalaczowi jako parametr, aby wyświetlić listę wszystkich otwartych plików w systemie? : O ty!
LanceBaynes,
2
Polecenie sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lessmoże wyświetlać wszystkie procesy z otwartymi plikami w zamontowanym systemie plików /. Aby uzyskać konkretną pomoc, zobacz stronę podręcznika man.
enzotib,
TY! daje wyjście w ten sposób: pastebin.com/raw.php?i=2z19g6Rk - poszukałem go, ale nie mogę znaleźć żadnego sposobu na wyświetlenie np .: „wygaszacz ekranu gnome”, a nie „wygaszacz ekranu gnome” - więc jak mogę go wypisać z szerokimi nazwami poleceń? : O
LanceBaynes
daje to samo wyjście dla: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes
Coś w tym stylu: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

Unix Rosetta Stone jest dobrym źródłem dla tego rodzaju pytania. Wymienia kilka alternatyw dla lsof (patrz poniżej). Zauważ jednak, że lsof jest de facto standardową aplikacją do tego, co robi.

Jeśli wszystko, czego potrzebujesz, to znaleźć identyfikatory procesów, które mają otwarty konkretny plik, możesz użyć go fuserw dowolnym systemie zgodnym z POSIX.

W systemach operacyjnych z /prockatalogiem można wyszukiwać pliki otwierane przez proces (odwrotność od lsofnajpopularniejszego trybu działania) poprzez informacje w /proc. Niektóre systemy operacyjne mają do tego polecenia:

Gilles „SO- przestań być zły”
źródło
8

Jeśli zdarzy ci się uruchomić Solaris, alternatywą dla lsof, która nie jest instalowana domyślnie i może się zadławić w ZFS, jest pfiles.

na przykład:

pfiles /proc/*

jlliagre
źródło
2

Moja wersja z tylko trochę mniej narzędziami:

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

Trzeba przyznać, że może nie obsługiwać wszystkich skrzynek narożnych, ale działa w moim przypadku użycia.

Bryce Schober
źródło
0

To powinno załatwić sprawę. Daje wszystkie mapowania deskryptorów plików oprócz tych, które:

  • nie masz uprawnień do przeglądania, lub
  • dotyczą plików zawierających ciąg „Odmowa zezwolenia”
( 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

Jeśli już wiesz, że zależy Ci tylko na mapowaniu niektórych programów, możesz zamiast tego użyć czegoś więcej w następujący sposób:

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
Parthian Shot
źródło
-2

Czasami lsofjest instalowany w/usr/sbin

Jeśli /usr/sbinnie jest częścią twojego $PATH, możesz przegapić nawet zainstalowane polecenie.

Sprawdź to za pomocą

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
Łaskawy
źródło
OP powiedział, że lsof nie został zainstalowany i poprosił o alternatywy ...
Jeff Schaller