Alternatives pour la commande «lsof»?

20

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

LanceBaynes
la source
1
Pourriez-vous être plus précis, s'il vous plaît? À quels systèmes, à part AIX (qui est définitivement pris en charge par lsof), pensez-vous? Ou n'y a-t-il qu'un seul type d'utilisation spécifique de lsof que vous envisagez? Généralement: pourquoi pas lsof?
rozcietrzewiacz
J'utilise Linux 2.6.18-92.el5 GNU, et je n'ai pas lsof, ni la possibilité d'utiliser lsof :(
SSH Ce
Question connexe: comment vérifier un fichier ouvert sans lsof
Stéphane Gourichon

Réponses:

20

Je sais fuser, voir si est disponible sur votre système.

enzotib
la source
que dois-je donner à l'unité de fusion comme paramètre pour répertorier tous les fichiers ouverts sur un système? : O ty!
LanceBaynes
2
La commande sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lesspeut afficher tous les processus ayant des fichiers ouverts sur le système de fichiers monté /. Voir la page de manuel pour une aide spécifique.
enzotib
TY! il donne une sortie comme celle-ci: pastebin.com/raw.php?i=2z19g6Rk - je l'ai recherché sur Google, mais je ne trouve aucun moyen de sortir ex.: "gnome-screensaver", pas "gnome-screensav" - donc comment puis-je le sortir avec des noms de commande larges? : O
LanceBaynes
il donne la même sortie pour: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes
Quelque chose comme ça: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

La pierre Unix Rosetta 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 les utiliser fusersur n'importe quel système compatible POSIX.

Sur les systèmes d'exploitation dotés d'un /procrépertoire, vous pouvez interroger les fichiers ouverts par un processus (à l'inverse du lsofmode de fonctionnement le plus courant de) via les informations de /proc. Certains systèmes d'exploitation ont des commandes pour cela:

Gilles 'SO- arrête d'être méchant'
la source
8

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/*

jlliagre
la source
2

Ma version, avec seulement un peu moins d'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.

Bryce Schober
la source
0

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 de 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
Flèche du Parthe
la source
-2

Parfois lsofest installé dans/usr/sbin

Si cela /usr/sbinne fait pas partie de votre $PATH, vous pourriez manquer la commande même installée.

Vérifiez avec

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
Clément
la source
Le PO a déclaré que lsof n'était pas installé et a demandé des alternatives ...
Jeff Schaller