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.