lsof es una herramienta que enumera los archivos abiertos en el sistema actual. En el entorno Linux, todo existe en forma de archivo: a través del archivo, no solo puede acceder a datos regulares, sino también a conexiones de red y hardware. Como el Protocolo de control de transmisión (TCP) y los sockets del Protocolo de datagramas de usuario (UDP), etc., el sistema asigna un descriptor de archivo para la aplicación en segundo plano, independientemente de la naturaleza del archivo, el descriptor de archivo es para la aplicación y La interacción entre los sistemas operativos básicos proporciona una interfaz común. Porque la lista de descriptores de archivos abiertos de la aplicación proporciona mucha información sobre la aplicación misma. Por lo tanto, la herramienta lsof puede ver esta lista para monitorear y solucionar problemas del sistema.
Significado de la información de salida
Ingrese lsof en la terminal para mostrar los archivos abiertos por el sistema. Debido a que lsof necesita acceder a la memoria central y a varios archivos, debe ejecutarse como usuario root para ejercer plenamente sus funciones.
[root@queen ~]# lsof /root/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
aliyun-se 757 root cwd DIR 253,1 4096 131073 /root
bash 17433 root cwd DIR 253,1 4096 131073 /root
lsof 17460 root cwd DIR 253,1 4096 131073 /root
lsof 17461 root cwd DIR 253,1 4096 131073 /root
Cada línea muestra un archivo abierto. Si no se especifican condiciones, todos los archivos abiertos por todos los procesos se mostrarán de forma predeterminada.
El significado de lsof que genera cada columna de información es el siguiente:
COMANDO: nombre de proceso PID: identificador de proceso
USUARIO: propietario del proceso
FD: descriptor de archivo. La aplicación identifica el archivo a través del descriptor de archivo. Tales como cwd, txt, etc. TYPE: tipo de archivo, como DIR, REG, etc.
DISPOSITIVO: especifique el nombre del disco
TAMAÑO: el tamaño del archivo
NODE: Inode (identificación del archivo en el disco)
NOMBRE: el nombre exacto del archivo abierto
lsof opciones comunes que significan
lsof filename #显示打开指定文件的所有进程
lsof -c 进程 -c 进程 #显示指定进程名现在打开的文件,可以同时列出多个程序的
lsof -p pid1,pid2... #查看指定进程号的进程打开了哪些文件
lsof -i #列出所有的网络连接
lsof -i[:service|port] #列出谁在使用某个特定的tcp/udp端口
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
ejemplo de uso de lsof
Recuperar archivos borrados
(1.1) Si un proceso ha abierto un archivo en el sistema, pero este archivo fue eliminado accidentalmente por nosotros, en este momento esperamos restaurar el archivo eliminado accidentalmente. Si el proceso correspondiente a un archivo que se eliminó accidentalmente no se cierra, el archivo se puede recuperar.
(1.2) El descriptor de archivo FD en Linux es el mismo concepto que el identificador de archivo en Windows. Un proceso abre un archivo y se genera un descriptor de archivo correspondiente. Si el proceso cierra el archivo, el descriptor de archivo O el identificador de archivo se liberará en consecuencia.
(1.3) El problema común en el entorno de producción es que algunos miembros del personal de mantenimiento o de desarrollo utilizan el comando de cola para ver los registros en tiempo real. Luego, otra persona usa el comando rm para eliminar, lo que hará que el espacio en disco no se libere realmente, porque el archivo que desea eliminar y el proceso está en uso, el identificador de archivo no se libera, es decir, cola
¿Qué es un archivo?
- El archivo es en realidad un enlace al inodo. El enlace del inodo contiene todos los atributos del archivo, como los permisos y el propietario, la dirección del bloque de datos (el archivo se almacena en estos bloques de datos en el disco). Cuando elimina (rm) un archivo, el El enlace al inodo se elimina y el contenido del inodo no se elimina. El proceso aún puede estar en uso. Solo cuando todos los enlaces del inodo se eliminan por completo, estos bloques de datos se pueden escribir con datos nuevos.
- El sistema de archivos proc puede ayudarnos a recuperar datos. Cada proceso en el sistema tiene un directorio y su propio nombre en / proc, que contiene un subdirectorio fd (descriptor de archivo) (el proceso necesita todos los enlaces para abrir archivos). Para eliminar un archivo del sistema de archivos, también hay una referencia de inodo:
/proc/进程号/fd/文件描述符
Debe conocer el número de proceso (pid) y el descriptor de archivo (fd) del archivo abierto, que se pueden obtener fácilmente a través de la herramienta lsof
Use el comando lsof para solucionar problemas
- Si conoce el nombre del archivo, puede usar directamente el siguiente comando
lsof |grep file
- Pero si no sabe qué archivo o muchos archivos tienen esta situación, debe usar el siguiente comando
lsof |grep deleted
- Use el comando kill para liberar el identificador de archivo para liberar espacio.
Supongamos que eliminamos accidentalmente / var / log / messages
[root@queen home]# lsof | grep deleted
rsyslogd 759 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
in:imjour 759 781 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
rs:main 759 782 root 4w REG 253,1 268564 264140 /var/log/messages (deleted)
## 4是句柄号
[root@queen home]# ls -l /proc/759/fd/4
l-wx------ 1 root root 64 Oct 10 15:56 /proc/759/fd/4 -> /var/log/messages (deleted)
[root@queen home]# cp /proc/759/fd/4 /var/log/message
[root@queen home]# ls -l /var/log/message
-rw------- 1 root root 268564 Mar 5 14:16 /var/log/message