lsof -p PID 与 lsof | grep PID

lsof -p PID 与 lsof | grep PID

我不明白 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)

答案1

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

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

答案2

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

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

如果没有任何选项,lsof 会列出属于所有活动进程的所有打开文件。当你这样做时lsof | grep PID,它会列出属于所有活动进程的所有打开文件,并 grep PID 号,它可以与 PID 本身以及任何地方匹配,其中 PID 作为其他 PID 的一部分出现,也可能是 PID 的子进程,并且很快。

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

答案3

某些版本的 lsof 包含线程 ID。这可以通过输出中显示的 TID 列标题来确定。这样的输出将导致条目重复,因为 lsof 可能会为每个线程显示一个重复条目。

https://support.datastax.com/hc/en-us/articles/209826153-lsof-shows-Cassandra-is-holding-a-large-amount-of-files-open

答案4

如果 PID 后面的进程不属于运行的用户lsof,则会看到以上输出。您可能需要成为 root 才能获得所需的输出。

相关内容