我不明白 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 可能会为每个线程显示一个重复条目。
答案4
如果 PID 后面的进程不属于运行的用户lsof
,则会看到以上输出。您可能需要成为 root 才能获得所需的输出。