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


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

Respuestas:


20

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


¿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:


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


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.


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

-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

El OP dijo que lsof no estaba instalado y pidió alternativas ...
Jeff Schaller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.