web-dev-qa-db-fra.com

Alternatives pour la commande "lsof"?

Dans de nombreux cas, "lsof" n'est pas installé sur les machines avec lesquelles je dois travailler, mais la "fonction" de lsof serait très nécessaire (ex. Sous AIX). : \

Existe-t-il des applications similaires à "lsof" dans le monde non Windows?

MISE À JOUR: par exemple: j'ai besoin de savoir quels processus utilisent le répertoire "/ home/username"?

21
LanceBaynes

Je connais fuser , voyez s'il est disponible sur votre système.

21
enzotib

nix Rosetta Stone est une bonne ressource pour ce genre de questions. Il mentionne quelques alternatives pour lsof (voir ci-dessous). Notez cependant que lsof est l'application standard de facto pour ce qu'il fait.

Si tout ce que vous voulez est de trouver les ID de processus qui ont un fichier particulier ouvert, vous pouvez utiliser fuser sur n'importe quel système compatible POSIX.

Sur les systèmes d'exploitation avec un /proc, vous pouvez interroger les fichiers ouverts par un processus (l'inverse du mode de fonctionnement le plus courant de lsof) via les informations de /proc. Certains systèmes d'exploitation ont des commandes pour cela:

S'il vous arrive d'exécuter Solaris, une alternative à lsof, qui n'est pas installée par défaut et pourrait s'étouffer sur ZFS, est pfiles.

par exemple:

pfiles /proc/*

8
jlliagre

Ma version, avec seulement un peu moins de fonctionnement des utilitaires:

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

Certes, il ne peut pas gérer tous les cas d'angle, mais fonctionne dans mon cas d'utilisation.

2
Bryce Schober

Cela devrait faire l'affaire. Il donnera tous les mappages de descripteurs de fichiers, sauf ceux qui:

  • vous n'êtes pas autorisé à afficher, ou
  • sont pour les fichiers qui contiennent la chaîne "Autorisation refusée"
( 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

Si vous savez déjà que vous ne vous souciez que des mappages pour certains programmes, vous pouvez utiliser à la place quelque chose de plus comme:

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