Si todo en Linux es un archivo, tiene que haber más que solo archivos en su disco duro. Este tutorial le mostrará cómo utilizar lsof
para ver todos los demás dispositivos y procesos que se manejan como archivos.
En Linux, todo es un archivo
La frase frecuentemente citada de que todo en Linux es un archivo es cierta. Un archivo es una colección de bytes. Cuando se leen dentro un programa o enviados a una impresora, parecen generar un flujo de bytes. Cuando se escriben para, ellos aceptar un flujo de bytes.
Muchos otros componentes del sistema aceptan o generan flujos de bytes, como teclados, conexiones de socket, impresoras y procesos de comunicación. Debido a que aceptan, generan o aceptan y generan flujos de bytes, estos dispositivos se pueden manejar, a un nivel muy bajo, como si fueran archivos.
Este concepto de diseño simplificó la implementación del sistema operativo Unix. Significaba que se podía crear un pequeño conjunto de controladores, herramientas y API para manejar una amplia gama de recursos diferentes.
Los archivos de datos y de programa que residen en su disco duro son archivos antiguos del sistema de archivos. Podemos utilizar el ls
comando para enumerarlos y conocer algunos detalles sobre ellos.
¿Cómo nos enteramos de todos los demás procesos y dispositivos que se tratan como si fueran archivos? Usamos el lsof
mando. Esto enumera los archivos abiertos en el sistema. Dicho de otra forma, enumera todo lo que se maneja como si fuera un archivo.
RELACIONADO: ¿Qué significa «todo es un archivo» en Linux?
El comando lsof
Muchos de los procesos o dispositivos que lsof
pueden informar sobre pertenecen a root o fueron iniciados por root, por lo que necesitará utilizar el sudo
comando con lsof
.
Y debido a que esta lista será muy larga, la vamos a canalizar less
.
sudo lsof | less
Antes de lsof
Aparece la salida Los usuarios de GNOME pueden ver un mensaje de advertencia en la ventana del terminal.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete.
lsof
intenta procesar todos los sistemas de archivos montados. Este mensaje de advertencia se genera debido a que lsof
ha encontrado un Sistema de archivos virtual GNOME (GVFS). Este es un caso especial de sistema de archivos en el espacio de usuario (FUSIBLE). Actúa como un puente entre GNOME, sus API y el kernel. Nadie, ni siquiera el root, puede tener acceso a uno de estos sistemas de archivos, aparte del propietario que lo montó (para este caso, GNOME). Puede ignorar esta advertencia.
La salida de lsof
es muy ancho. Las columnas de la izquierda son:
Las columnas de la derecha son:
Las lsof columnas
No todas las columnas se aplican a todos los tipos de archivos abiertos. Es normal que algunos de ellos estén en blanco.
- Mando: El nombre del comando asociado con el procedimiento que abrió el archivo.
- PID: Número de identificación del procedimiento del procedimiento que abrió el archivo.
- TID: Número de identificación de la tarea (hilo). Una columna en blanco significa que no es una tarea; es un procedimiento.
- Usuario: ID de usuario o nombre del usuario al que pertenece el procedimiento, o la ID de usuario o inicio de sesión de la persona propietaria del directorio en
/proc
dóndelsof
encuentra información sobre el procedimiento. - FD: Muestra el descriptor de archivo del archivo. Los descriptores de archivo se describen a continuación.
- Escribe: tipo de nodo asociado al archivo. Los tipos de notas se describen a continuación.
- Dispositivo: Contiene los números de dispositivo, separados por comas, para un carácter especial, especial de bloque, regular, directorio o archivo NFS, o una dirección de referencia del kernel que identifica el archivo. Además puede mostrar la dirección base o el nombre del dispositivo de un dispositivo de socket Linux AX.25.
- Tamaño / Apagado: Muestra el tamaño del archivo o el desplazamiento del archivo en bytes.
- Nodo: Muestra el número de nodo de un archivo local o el número de inodo de un archivo NFS en el host del servidor o el tipo de protocolo de Internet. Puede mostrar STR para una secuencia o la IRQ o el número de inodo de un dispositivo de socket Linux AX.25.
- Nombre: Muestra el nombre del punto de montaje y el sistema de archivos en el que reside el archivo.
La columna FD
El descriptor de archivo en la columna FD puede ser una de las muchas opciones; la página del manual enumerarlos todos.
La entrada de la columna FD puede constar de tres partes: un descriptor de archivo, un carácter de modo y un carácter de bloqueo. Algunos descriptores de archivos comunes son:
- cwd: Directorio de trabajo actual.
- errar: Error de información de FD (consulte la columna NOMBRE).
- ltx: Texto de biblioteca compartida (código y datos).
- m86: Archivo mapeado de combinación de DOS.
- mem: Archivo mapeado en memoria.
- mmap: Dispositivo con mapa de memoria.
- pd: Directorio de padres.
- rtd: Directorio raíz.
- TXT: Texto del programa (código y datos)
- Un número que representa un descriptor de archivo.
El carácter de modo puede ser uno de los siguientes:
- r: Acceso de lectura.
- w: Acceso de escritura.
- tu: Acceso de lectura y escritura.
- »: Un carácter de espacio, si se desconoce el modo y no hay ningún carácter de bloqueo.
- –: Modo desconocido y hay un carácter de bloqueo.
El carácter de bloqueo puede ser uno de los siguientes:
- r: Leer bloqueo en parte del archivo.
- R: Leer bloqueo en todo el archivo.
- w: Escriba bloqueo en parte del archivo.
- W: Escriba bloqueo en todo el archivo.
- tu: Bloqueo de lectura y escritura de cualquier longitud.
- U: Tipo de bloqueo desconocido.
- »: Un carácter de espacio. Sin cerradura.
La columna TIPO
Existen más de 70 entradas que puede aparecer en la columna TIPO. Algunas entradas comunes que verá son:
- REG: Archivo normal del sistema de archivos.
- DIR: Directorio.
- FIFO: Primero en llegar y primero en salir.
- CHR: Archivo especial de caracteres.
- BLK: Bloquear archivo especial.
- INET: Toma de Internet.
- unix: Socket de dominio UNIX
Ver procesos que han abierto un archivo
Para ver los procesos que han abierto un archivo determinado, proporcione el nombre del archivo como parámetro para lsof
. A modo de ejemplo, para ver los procesos que se han abierto kern.log
archivo, use este comando:
sudo lsof /var/log/kern.log
lsof
responde mostrando el procedimiento único, rsyslogd
que fue iniciado por el usuario syslog
.
Ver todos los archivos abiertos desde un directorio
Para ver los archivos que se han abierto desde un directorio y los procesos que los abrieron, pase el directorio a lsof
como parámetro. Debes utilizar el +D
opción (directorio).
Para ver todos los archivos que están abiertos en el /var/log/
directorio, use este comando:
sudo lsof +D /var/log/
lsof
responde con una lista de todos los archivos abiertos en ese directorio.
Para ver todos los archivos que se han abierto desde el /home
directorio, use el siguiente comando:
sudo lsof +D /home
Los archivos se han abierto desde el /home
se muestran el directorio. Tenga en cuenta que con descripciones más cortas en algunas de las columnas, la lista completa es más limitada.
Listar archivos abiertos por un procedimiento
Para ver los archivos que han sido abiertos por un procedimiento en particular, use el -c
(comando) opción. Tenga en cuenta que puede proporcionar más de una definición de búsqueda para lsof
En seguida.
sudo lsof -c ssh -c init
lsof
proporciona una lista de los archivos que han sido abiertos por cualquiera de los procesos proporcionados en la línea de comando.
Ver archivos abiertos por un usuario
Para limitar la visualización a los archivos que han sido abiertos por un usuario específico, utilice el -u
opción (usuario). En este ejemplo, veremos los archivos que han sido abiertos por procesos que son propiedad de Mary o se han iniciado en nombre de Mary.
sudo lsof -u mary
Todos los archivos enumerados se han abierto en nombre del usuario Mary. Esto incluye archivos que han sido abiertos por el entorno de escritorio, a modo de ejemplo, o simplemente como consecuencia de que Mary haya iniciado sesión.
Excluir archivos abiertos por un usuario
Para excluir los archivos que ha abierto un usuario, utilice el ^
operador. La exclusión de usuarios de la lista facilita la búsqueda de la información que le interesa. Debe usar la -u
opción como antes, y agregue la ^
carácter al comienzo del nombre del usuario.
sudo lsof +D /home -u ^mary
Esta vez, la lista de /home
El directorio no incluye ninguno de los archivos abiertos por el usuario Mary.
Lista de archivos abiertos por un procedimiento
Para enumerar los archivos que se han abierto a través de un procedimiento específico, utilice el -p
(procedimiento) y proporcione el ID del procedimiento como parámetro.
sudo lsof - p 4610
Todos los archivos que se han abierto con el ID de procedimiento que proporcionas se enumeran automáticamente.
Listado de ID de procedimiento que han abierto un archivo
Para ver los ID de procedimiento de los procesos que han abierto un archivo en particular, use el -t
(conciso) y proporcione el nombre del archivo en la línea de comando.
sudo lsof -t /usr/share/mime/mime.cache
Los ID de procedimiento se muestran en una lista simple.
Utilizar búsquedas Y y O
Enumeremos los archivos que ha abierto el usuario Mary, que están relacionados con los procesos SSH. Sabemos que podemos proporcionar más de un elemento de búsqueda en la línea de comando, por lo que debería ser fácil.
sudo lsof -u mary -c ssh
Ahora veamos la salida de lsof
. Eso no se ve bien; hay entradas en la salida que fueron iniciadas por root.
Eso no es lo que esperábamos. ¿Qué sucedió?
Cuando proporcionas varios términos de búsqueda lsof
devolverá cualquier archivo que coincida con el primer término de búsqueda o el segundo término de búsqueda, y así sucesivamente. Dicho de otra forma, realiza una búsqueda OR.
Para hacer lsof
realizar una búsqueda AND, utilice el -a
(y) opción. Esto significa que los únicos archivos que se enumerarán serán los que coincidan con el primer término de búsqueda, y el segundo término de búsqueda, y así sucesivamente.
Intentemos eso de nuevo y usemos el -a
opción.
sudo lsof -u mary -c ssh -a
Ahora, cada archivo de la lista es uno que ha sido abierto por o en nombre de Mary, y está relacionado con el comando SSH.
Actualizar automáticamente la pantalla
Podemos utilizar el +|-r
(repetir) opción para poner lsof
en modo de repetición. La opción de repetición se puede aplicar de dos formas, ya sea +r
o -r
. Además debemos sumar la cantidad de segundos que queramos lsof
esperar antes de actualizar la pantalla.
El uso de la opción de repetición en cualquier formato hace lsof
muestra los resultados como de costumbre, pero agrega una línea discontinua en la parte inferior de la pantalla. Espera el número de segundos proporcionado en la línea de comando y posteriormente actualiza la pantalla con un nuevo conjunto de resultados.
Con el -r
opción esto continuará hasta que presione Ctrl + C. Con el +r
formato, continuará hasta que no haya resultados para mostrar, o hasta que presione Ctrl + C.
sudo lsof -u mary -c ssh -a -r5
Tenga en cuenta la línea punteada en la parte inferior de la lista. Esto separa cada nueva visualización de datos cuando se actualiza la salida.
Visualización de archivos asociados con conexiones a Internet
los -i
La opción (Internet) le posibilita ver los archivos abiertos por procesos asociados con la red y las conexiones a Internet.
lsof -i
Se muestran todos los archivos abiertos por la red y las conexiones a Internet.
Visualización de archivos asociados con conexiones a Internet por ID de procedimiento
Para ver los archivos abiertos por las conexiones de Internet que están asociados con un ID de procedimiento específico, agregue el -p
opción y la -a
opción.
Aquí buscamos archivos abiertos a través de una conexión a Internet o de red, a través de un procedimiento con un ID de 606.
sudo lsof -i -a -p 606
Se muestran todos los archivos abiertos por el ID de procedimiento 606 que están asociados con las conexiones de red o de Internet.
Visualización de archivos asociados con conexiones y comandos de Internet
Podemos utilizar el -c
(comando) opción para buscar archivos abiertos por procesos específicos. Para buscar archivos que hayan sido abiertos por Internet o conexiones de red asociadas con el ssh
procedimiento, use el siguiente comando:
lsof -i -a -c ssh
Todos los archivos abiertos debido a los procesos ssh se enumeran en la salida.
Visualización de archivos asociados con conexiones y puertos de Internet
Podemos hacer lsof
Informar sobre los archivos que se abrieron a través de conexiones de red o de Internet en un puerto específico. Para hacer esto, usamos el :
carácter seguido del número de puerto.
Aquí estamos preguntando lsof
para enumerar los archivos que se han abierto a través de conexiones de red o de Internet a través de el puerto 22.
lsof -i :22
Todos los archivos enumerados fueron abiertos por procesos asociados con el puerto 22 (que es el puerto predeterminado para las conexiones SSH).
Visualización de archivos asociados con conexiones y protocolos de Internet
Podemos preguntar lsof
para mostrar los archivos que han sido abiertos por procesos asociados con conexiones de red e Internet, que están usando un protocolo específico. Podemos seleccionar entre TCP, UDP y SMTP. Usemos el protocolo TCP y veamos qué obtenemos.
sudo lsof -i tcp
Los únicos archivos enumerados son los abiertos por procesos que usan el protocolo TCP.
Solo hemos rayado la superficie
Esa es una buena base en algunos casos de uso comunes para lsof
, pero hay mucho más que eso. Cuánto más se puede juzgar por el hecho de que la página de manual tiene más de 2.800 líneas.
los lsof
El comando se puede usar para profundizar cada vez más en los estratos de archivos abiertos y pseudoarchivos. Hemos proporcionado un mapa esquemático; el atlas está en la página del manual.
setTimeout(function(){
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version=’2.0′;
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, document,’script’,
‘https://connect.facebook.net/en_US/fbevents.js’);
fbq(‘init’, ‘335401813750447’);
fbq(‘track’, ‘PageView’);
},3000);