lsof -p PID vs lsof | grep PID

12

No entiendo la salida del comando lsof.

Cuando yo escribo

lsof -p PID

Me salen 4 lineas y cuando escribo

lsof | grep PID

Tengo cientos de líneas.

¿No debería devolver el mismo resultado?

Gracias por sus respuestas. Aquí están los resultados. Parece que es un subproceso o lo que significan estas tareas?

lsof -p 29076
COMMAND   PID  USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
java    29076  pr    cwd   unknown                      /proc/29076/cwd (readlink: Permission denied)
java    29076  pr    rtd   unknown                      /proc/29076/root (readlink: Permission denied)
java    29076  pr    txt   unknown                      /proc/29076/exe (readlink: Permission denied)
java    29076  pr   NOFD                                /proc/29076/fd (opendir: Permission denied)

lsof |grep 29076|head -20
java      29076        pr  cwd   unknown                          /proc/29076/cwd (readlink: Permission denied)
java      29076        pr  rtd   unknown                          /proc/29076/root (readlink: Permission denied)
java      29076        pr  txt   unknown                          /proc/29076/exe (readlink: Permission denied)
java      29076        pr NOFD                                    /proc/29076/fd (opendir: Permission denied)
java      29076   300  pr  cwd   unknown                          /proc/29076/task/300/cwd (readlink: Permission denied)
java      29076   300  pr  rtd   unknown                          /proc/29076/task/300/root (readlink: Permission denied)
java      29076   300  pr  txt   unknown                          /proc/29076/task/300/exe (readlink: Permission denied)
java      29076   300  pr NOFD                                    /proc/29076/task/300/fd (opendir: Permission denied)
java      29076   329  pr  cwd   unknown                          /proc/29076/task/329/cwd (readlink: Permission denied)
java      29076   329  pr  rtd   unknown                          /proc/29076/task/329/root (readlink: Permission denied)
java      29076   329  pr  txt   unknown                          /proc/29076/task/329/exe (readlink: Permission denied)
java      29076   329  pr NOFD                                    /proc/29076/task/329/fd (opendir: Permission denied)
java      29076   330  pr  cwd   unknown                          /proc/29076/task/330/cwd (readlink: Permission denied)
java      29076   330  pr  rtd   unknown                          /proc/29076/task/330/root (readlink: Permission denied)
java      29076   330  pr  txt   unknown                          /proc/29076/task/330/exe (readlink: Permission denied)
java      29076   330  pr NOFD                                    /proc/29076/task/330/fd (opendir: Permission denied)
java      29076   331  pr  cwd   unknown                          /proc/29076/task/331/cwd (readlink: Permission denied)
java      29076   331  pr  rtd   unknown                          /proc/29076/task/331/root (readlink: Permission denied)
java      29076   331  pr  txt   unknown                          /proc/29076/task/331/exe (readlink: Permission denied)
java      29076   331  pr NOFD                                    /proc/29076/task/331/fd (opendir: Permission denied)
IL Mare
fuente

Respuestas:

7

Sin ver el resultado real, es difícil decir exactamente lo que está sucediendo, pero supongo que se debe al hecho de que el lsof -p PIDcomando solo imprime archivos que se abren con el PID especificado mientras lsof | grep PIDimprime las líneas donde está 'PID' ubicado en cualquier lugar de la línea. Por ejemplo, si está buscando PID = 123, su grepopción también imprimirá líneas para los 1231, 1232, 1233, etc. de PID, así como cualquier archivo que se encuentre en carpetas con 123 en cualquier lugar de su ruta completa.

EDITAR: en su ejemplo específico, la diferencia es que lsofignora los archivos abiertos por un hilo. Si observa el resultado en el grepejemplo, la tercera columna es el 'TID' o ID de subproceso. Las líneas sin un TID coinciden con lo que estaba viendo cuando utilizó la -popción. Las líneas con un TID (es decir, líneas abiertas por otros hilos) son los extras.

David King
fuente
En realidad, el TID se conoce en las páginas de manual como "Número de identificación de ID de tarea", no necesariamente una ID de subproceso.
Miljen Mikic
2

lsof: enumera los archivos abiertos, intenta leer la página de manual de lsof #man lsof

lsof -p PID enumera los archivos abiertos asociados con la identificación del proceso de PID.

En ausencia de opciones, lsof enumera todos los archivos abiertos que pertenecen a todos los procesos activos. cuando lo hace lsof | grep PID, enumera todos los archivos abiertos que pertenecen a todos los procesos activos y selecciona el número PID, que puede coincidir con el PID mismo y en cualquier lugar, donde PID aparece como parte de otros PID y también puede ser el proceso secundario de PID, y pronto.

Por lo tanto, si desea usar lsof | grep PID, debe coincidir exactamente con el PID, como la concordancia de la palabra completa lsof | grep -w PID, pero aún así se generarán más líneas si el PID tiene otros procesos secundarios.

Ijaz Ahmad Khan
fuente
0

Probé esto en mi sistema, y ​​ambos comandos generan las mismas listas, le sugiero que pruebe ambos comandos consecutivamente varias veces, solo para asegurarse de que el estado del proceso sea estable. Según la página de manual y sus resultados, esta es la única explicación que puedo tener.

usuario148564
fuente