GNU/Linux >> Tutoriales Linux >  >> Linux

lsof :ejemplos más utilizados

El comando lsof enumera archivos abiertos, sockets y conductos. Puede usar el comando lsof para ver qué archivos se mantienen abiertos (como bibliotecas o archivos de registro) y qué puertos escuchan los demonios. Puede buscar archivos abiertos usando el comando lsof. lsof debe ejecutarse como superusuario (raíz) para ver todos los archivos abiertos. Cuando se usa sin argumentos/opciones, lsof enumera todos los archivos abiertos para los procesos activos actuales.

# lsof
COMMAND     PID   USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
init          1   root  cwd       DIR              253,0        4096          2 /
init          1   root  rtd       DIR              253,0        4096          2 /
init          1   root  txt       REG              253,0      150352    4587561 /sbin/init (deleted)
init          1   root  DEL       REG              253,0                4849693 /lib64/libnss_files-2.12.so
..........

Comprender la salida del comando "lsof":

COMMAND: Command using the file.
PID: PID of the file
USER: Owner of the file
FD: File descriptor. Different flags of File descriptor are as below:

#    :  The number in front of flag(s) is the file descriptor number used by the process to associate with the file
u    :  File open with Read and Write permission
r    :  File open with Read permission
w    :  File open with Write permission
W    :  File open with Write permission and with Write Lock on entire file
mem  :   Memory mapped file, usually for shared library

TYPE: File type. Different flags of File type are as below:
REG - Regular file
DIR - Directory

DEVICE: major, minor number of the device where file resides.
SIZE/OFF: File size
NODE: inode number
NAME: File name

Buscar archivos abiertos bajo un punto de montaje

Los archivos abiertos en un directorio en particular se pueden encontrar usando lsof. Por ejemplo, abra un archivo de texto (no lo cierre, manténgalo abierto) en un directorio para editarlo usando vi y verifique la salida de lsof en ese directorio en otra sesión.

# cd /test
# vi a.txt

En otra sesión, verifique la salida de lsof en ese directorio:

# lsof /test
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    2972 root  cwd    DIR  253,0     4096 262145 /test
vi      3012 root  cwd    DIR  253,0     4096 262145 /test

Esto también se puede usar para desmontar el punto de montaje ocupado. Los procesos que mantienen ocupado el punto de montaje se pueden encontrar utilizando lsof.

Buscar información sobre un proceso en particular

Para obtener más información sobre un proceso en particular, use la opción -p para lsof:

# lsof -p 8797

Mostrar direcciones de escucha

Los demonios pueden vincularse a la dirección IPv4 global 0.0.0.0 o a direcciones específicas, como 127.0.0.1 (localhost). Solo se podrá acceder a un demonio vinculado a la dirección localhost desde el propio sistema. Utilice las opciones -i y -nP en lsof para mostrar los puertos de escucha sin búsquedas en nombres de host y servicios. Por ejemplo, lo siguiente muestra el demonio Apache httpd ejecutándose en localhost en el puerto no estándar de 7777. Otros sistemas no podrán conectarse a estos procesos httpd:bueno para la seguridad, malo para la conectividad remota.

Ejemplo:

# lsof -i -nP | grep httpd
httpd 8616 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
httpd 8614 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
httpd 8623 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)

Ejemplo:
Por el contrario, el siguiente proceso OpenSSH sshd aceptará conexiones de otros sistemas, ya que está vinculado a la dirección 0.0.0.0, como lo indica el * que precede al número de puerto.

# lsof -i -P | grep sshd
sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)

Ciertas aplicaciones escuchan en muchos puertos diferentes, como el daemon llamado Berkeley Internet Name Daemon (BIND), versión 9.

Ejemplo:

# lsof -i -nP | grep ^named
named 9865 named 5u IPv6 0x03348be0 0t0 UDP *:53
named 9865 named 6u IPv6 0x0566re80 0t0 TCP *:53 (LISTEN)
named 9865 named 7u IPv4 0x03456b10 0t0 UDP 127.0.0.1:53
named 9865 named 8u IPv4 0x01870570 0t0 TCP 127.0.0.1:53 (LISTEN)
named 9865 named 9u IPv4 0x03456a40 0t0 UDP *:49164
named 9865 named 10u IPv6 0x03456970 0t0 UDP *:49165
named 8888 named 11u IPv4 0x0186fd54 0t0 TCP *:953 (LISTEN)
named 8888 named 13u IPv4 0x01387ee0 0t0 UDP 168.1.863.1:67
named 8888 named 14u IPv4 0x099899ce4 0t0 TCP 168.1.863.1:67(LISTEN)

Buscar archivos abiertos por un proceso

Es posible que un proceso no funcione por otras razones, como un firewall, un control de servicio de acceso como tcp_wrappers o alguna otra configuración incorrecta. Use ping, telnet o nmap para verificar desde un sistema remoto si algo más puede estar bloqueando la solicitud, o ejecute tcpdump para ver si las conexiones salen de la fuente o llegan al sistema de destino.

Ejemplo
Para ver qué archivos abren los procesos cuyos nombres empiezan por “t” (telnetd…) y bash. Y para ver qué archivos abre init, use los siguientes comandos:

# lsof -c t
# lsof -c bash
# lsof -c init

Ejemplo
Para ver qué archivos abren los procesos cuyos nombres comienzan con "testuser", pero excluyen aquellos cuyo propietario es el usuario "tom", use el siguiente comando:

# lsof -c testuser -u ^tom

Buscar procesos abiertos por usuarios

Para ver qué procesos abren los usuarios myuser y tom, use el siguiente comando:

# lsof -u myuser,tom

Encontrar el puerto usado por el proceso

Para ver qué procesos están usando un puerto en particular, use el siguiente comando:

# lsof -i TCP:389

¿Cómo encontrar el número de archivos abiertos para un nombre de proceso y el pid del proceso ordenado por número de archivos abiertos?

Esto puede ser interesante cuando aparece el error "demasiados archivos abiertos". Utilice el siguiente script que utiliza el comando lsof:

# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'

Encuentre procesos utilizando Max File Descriptors

Los límites de los descriptores de archivos se pueden establecer mediante el siguiente comando para un shell:

# ulimit -n 65536

Use el comando "lsof" para encontrar qué está usando los descriptores de archivos en el sistema.

# lsof -g | awk '{print $2}' | sort -u > /tmp/lsof_sort.txt
# for var in `cat /tmp/lsof_sort.txt` 
do 
	echo `echo "$var ---- "``grep -x $var /tmp/lsof.txt | wc -l` 
done

Esto mostrará una lista de todos los procesos y el número correspondiente de archivos abiertos por ellos. Puede elegir los procesos que tienen la mayor cantidad de archivos abiertos y ver cuáles son.


Linux
  1. [Linux]:15 comandos YUM más utilizados con ejemplos

  2. ¿Encontrar las N palabras más frecuentes en un archivo?

  3. 7 ejemplos del comando lsof en Linux

  4. Los 25 ejemplos de reglas de IPTables de Linux más utilizados

  5. Ejemplos de comandos ln en Linux

Comando WC de Linux con ejemplos

35 ejemplos de secuencias de comandos Bash

Ejemplos de comandos cat de Linux

Ejemplos de comandos gzip de Linux

Ejemplos de comandos dumpe2fs en Linux

Ejemplos de comandos fsck en Linux