当我使用-p $PID
on时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
继续查看该文件,而打开该文件的线程不再存在。