帮助理解lsof和线程

帮助理解lsof和线程

当我使用-p $PIDon时lsof,我只得到进程的直接线程。为什么以及如何有效地使用线程和 lsof?

sudo lsof -p 5344 > lsof-p5344.log
sudo lsof | grep  '\<5344\>' > lsofgrep5344.log

$ wc -l lsof*5344.log
  1,120,208 lsofgrep5344.log
      2,166 lsof-p5344.log

这些是确切过程的线路。这是不是关于儿童进程。在这里,我使用awk精确地过滤输出字段二上的进程 PID 编号(lsof 输出的第二列)。

$ cat lsof-p5344.log  | awk '{print $2}' | grep '^5344$' | wc -l
2,165

$ cat lsofgrep5344.log  | awk '{print $2}' | grep '^5344$' | wc -l
1,120,207

现在,如果我按第一列“COMMAND”进行过滤,那么我会看到java应用程序的不同线程,而一个lsof -p只会显示主线程(例如“COMMAND=java_daemon”),而lsof | grep会有许多线程(例如“COMMAND=pool123”) 、JMX、Java2D、Quartz 等”,其中“PID”均等于 5344)

答案1

在我的系统上,lsof -k显示线程号。但我猜资源(文件、内存映射...)是为整个进程分配的(一个线程打开的文件可以由另一个线程使用),然后挖掘线程似乎并不相关。

在我的 Linux 系统上,我创建了一个线程,该线程在打开文件后立即终止。lsof继续查看该文件,而打开该文件的线程不再存在。

相关内容