lsof -p PID contre lsof | grep PID

12

Je ne comprends pas la sortie de la commande lsof.

Quand j'écris

lsof -p PID

J'obtiens 4 lignes et quand j'écris

lsof | grep PID

Je reçois des centaines de lignes.

Ne devrait-il pas retourner le même résultat?

Merci pour vos réponses. Voici la sortie. On dirait que c'est un sous-processus ou que signifient ces tâches?

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
la source

Réponses:

7

Sans voir la sortie réelle, il est difficile de dire exactement ce qui se passe, mais je suppose que cela est dû au fait que la lsof -p PIDcommande imprime simplement les fichiers ouverts par le PID spécifié tandis que le lsof | grep PIDimprime toutes les lignes où 'PID' est situé n'importe où sur la ligne. Par exemple, si vous recherchez PID = 123, votre grepoption imprimera également des lignes pour les PID 1231, 1232, 1233, etc. ainsi que tous les fichiers qui se trouvent dans des dossiers avec 123 n'importe où sur leur chemin complet.

EDIT: Dans votre exemple spécifique, la différence est qu'il lsofignore les fichiers ouverts par un thread. Si vous regardez la sortie dans l' grepexemple, la troisième colonne est le «TID» ou Thread ID. Les lignes sans TID correspondent à ce que vous voyiez lorsque vous avez utilisé l' -poption. Les lignes avec un TID (c'est-à-dire les lignes ouvertes par d'autres threads) sont les extras.

David King
la source
En fait, le TID est appelé dans les pages de manuel "Numéro d'identification de la tâche", pas nécessairement un ID de thread.
Miljen Mikic
2

lsof - liste les fichiers ouverts, essayez de lire la page de manuel de lsof #man lsof

lsof -p PID répertorie les fichiers ouverts associés à l'ID de processus du PID.

En l'absence d'options, lsof répertorie tous les fichiers ouverts appartenant à tous les processus actifs. lorsque vous le faites lsof | grep PID, il répertorie tous les fichiers ouverts appartenant à tous les processus actifs et grep le numéro PID, qui peut correspondre au PID lui-même et également n'importe où, où le PID apparaît comme faisant partie d'autres PID et peut également être le processus enfant du PID, et bientôt.

Par conséquent, si vous souhaitez l'utiliser, lsof | grep PIDvous devez faire correspondre le PID exactement, comme la correspondance de mots complets lsof | grep -w PID, mais cela entraînera toujours plus de lignes si le PID a d'autres processus enfants.

Ijaz Ahmad Khan
la source
0

J'ai essayé cela sur mon système, et les deux commandes génèrent les mêmes listes, je vous suggère d'essayer les deux commandes consécutivement plusieurs fois, juste pour vous assurer que l'état du processus est stable. Selon la page de manuel et vos sorties, c'est la seule explication que je puisse avoir.

user148564
la source