lsof -p PID与lsof | grep PID


12

我不了解lsof命令的输出。

当我写

lsof -p PID

我得到4行,当我写

lsof | grep PID

我得到数百行。

它不应该返回相同的结果吗?

谢谢你的回复。这是输出。看起来是子流程,还是这个任务是什么意思?

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)

Answers:


7

在没有看到实际输出的情况下,很难确切地说出正在发生什么,但是我猜这是由于以下事实造成的:该lsof -p PID命令只是打印出由指定PID打开的文件,而lsof | grep PID正在打印出其中“ PID”为位于生产线的任何地方。例如,如果要搜索PID = 123,则您的grep选项还将打印PID的1231、1232、1233等行以及位于其完整路径中任何位置为123的文件夹中的任何文件。

编辑:在您的特定示例中,不同之处在于lsof忽略了线程打开的文件。如果查看grep示例中的输出,则第三列是“ TID”或线程ID。没有TID的行与使用该-p选项时所看到的相符。具有TID的行(即由其他线程打开的行)是额外的。


实际上,TID在手册页中称为“任务ID编号”,不一定是线程ID。
Miljen Mikic

2

lsof-列出打开的文件,尝试阅读lsof的手册页 #man lsof

lsof -p PID 列出与进程ID关联的打开文件。

如果没有任何选项,lsof会列出属于所有活动进程的所有打开文件。执行此操作时lsof | grep PID,它将列出属于所有活动进程的所有打开文件,并grep PID编号,它可以与PID本身以及任何其他位置(在PID出现在其他PID的一部分中,也可以是PID的子进程)中的任何位置匹配,并且以此类推。

因此,如果要使用,lsof | grep PID则应该完全匹配PID,就像全字匹配一样lsof | grep -w PID,但是如果PID具有其他子进程,它将仍然导致更多行。


0

我在系统上进行了尝试,并且两个命令都生成相同的列表,建议您连续几次尝试这两个命令,以确保进程状态稳定。根据手册页和您的输出,这是我唯一能得到的解释。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.