¿Alternativas para el comando "lsof"?

20

En muchos casos, "lsof" no está instalado en las máquinas con las que tengo que trabajar, pero la "función" de lsof sería muy necesaria (por ejemplo, en AIX). : \

¿Hay alguna aplicación similar a "lsof" en el mundo que no es de Windows?

ACTUALIZACIÓN: por ejemplo: necesito saber que procesos utilizan el directorio "/ home / username"?

LanceBaynes
fuente
1
¿Podría ser más específico, por favor? ¿Qué sistemas aparte de AIX (que definitivamente es compatible con lsof) tiene en mente? ¿O solo hay un tipo específico de uso de ls que tiene en mente? En general: ¿por qué no lsof?
rozcietrzewiacz
Estoy usando Linux 2.6.18-92.el5 GNU, y no tengo lsof, ni tengo la capacidad de usar lsof :(
SSH Este
Pregunta relacionada: cómo verificar el archivo abierto sin lsof
Stéphane Gourichon

Respuestas:

20

Sé de fuser, ver si está disponible en su sistema.

enzotib
fuente
¿Qué debo dar al fusor como parámetro para enumerar todos los archivos abiertos en un sistema? : O ty!
LanceBaynes
2
El comando sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lesspuede mostrar todos los procesos que tienen archivos abiertos en el sistema de archivos montado /. Consulte la página del manual para obtener ayuda específica.
enzotib
TY! da una salida como esta: pastebin.com/raw.php?i=2z19g6Rk - busqué en Google, pero no puedo encontrar ninguna forma de salida, por ejemplo: "gnome-screensaver", no "gnome-screensav" - entonces ¿Cómo puedo mostrarlo con nombres de comando amplios? : O
LanceBaynes
da el mismo resultado para: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes
Algo como esto: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 piedra de Rosetta Unix es un buen recurso para este tipo de preguntas. Menciona algunas alternativas para lsof (ver más abajo). Sin embargo, tenga en cuenta que lsof es la aplicación estándar de facto para lo que hace.

Si todo lo que desea es encontrar las ID de proceso que tienen abierto un archivo en particular, puede usarlo fuseren cualquier sistema compatible con POSIX.

En los sistemas operativos con un /procdirectorio, puede consultar los archivos abiertos por un proceso (lo contrario del lsofmodo de operación más común) a través de la información en /proc. Algunos sistemas operativos tienen comandos para eso:

Gilles 'SO- deja de ser malvado'
fuente
8

Si ejecuta Solaris, lsofexiste una alternativa a , que no está instalada de manera predeterminada y podría ahogarse en ZFS pfiles.

p.ej:

pfiles /proc/*

jlliagre
fuente
2

Mi versión, con solo un poco menos de utilidades:

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

Es cierto que puede que no maneje todos los casos de esquina, pero está funcionando en mi caso de uso.

Bryce Schober
fuente
0

Esto debería funcionar. Le dará todas las asignaciones de descriptores de archivo, excepto las que:

  • no tiene permiso para ver, o
  • son para archivos que contienen la cadena "Permiso denegado"
( 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 ya sabe que solo le importan las asignaciones para ciertos programas, podría usar algo más en la línea de:

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
Tiro de Partia
fuente
-2

A veces lsofse instala en/usr/sbin

Si /usr/sbinno es parte de su $PATH, podría perder el comando incluso instalado.

Compruébalo con

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
Clemente
fuente
El OP dijo que lsof no estaba instalado y pidió alternativas ...
Jeff Schaller