lsof 输出中是否显示所有打开的文件?

lsof 输出中是否显示所有打开的文件?

在所有情况下,我发现任何打开以进行读取或写入的文件都会显示在 lsof 输出中。但今天,我试图在 lsof 输出中找到一个由 java 进程打开以进行写入的日志文件。但我在输出中找不到它。但日志文件处于活动状态并且正在更新。

由 java 或 python 等打开的文件是否不会显示在 lsof 输出中?

供参考,

# lsof /usr/local/qftest/log/qftest.log
# lsof -p 30732 -a +d /usr/local/qftest/log
# lsof -p 30732 -a +D /usr/local/qftest/log
# lsof | grep qftest.log
# ps -p 30732 -f
  qftest 30732 1 99 Sep09 ? 6-07:37:34 java -Xbootclasspath/p:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xalan.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xerces.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xml-apis.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/serializer.jar -Dqftest.home=/usr/local/qftest -Dqftest.versionhome=/usr/local/qftest/qftest-3.5.7 -Dqftest.display= -Xmx256m -Xms16m -classpath /usr/local/qftest/qftest-3.5.7/qflib/qftest.jar:/usr/local/qftest/qftest-3.5.7/qflib/qfshared.jar:/usr/local/qftest/qftest-3.5.7/qflib/qfdemo.jar:/usr/local/qftest/qftest-3.5.7/qflib/qflog.jar:/usr/local/qftest/qftest-3.5.7/qflib/qflib.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/serializer.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xml-apis.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xerces.jar:/usr/local/qftest/qftest-3.5.7/lib/endorsed/xalan.jar:/usr/local/qftest/qftest-3.5.7/lib/truezip.jar:/usr/local/qftest/qftest-3.5.7/lib/poi.jar:/usr/local/qftest/qftest-3.5.7/lib/netty.jar:/usr/local/qftest/qftest-3.5.7/lib/looks.jar:/usr/local/qftest/qftest-3.5.7/lib/jxl.jar:/usr/local/qftest/qftest-3.5.7/lib/junit.jar:/usr/local/qftest/qftest-3.5.7/lib/jide-oss.jar:/usr/local/qftest/qftest-3.5.7/lib/jfreechart.jar:/usr/local/qftest/qftest-3.5.7/lib/jcommon.jar:/usr/local/qftest/qftest-3.5.7/lib/commons.jar:/usr/local/qftest/qftest-3.5.7/lib/pngencoder.jar:/usr/local/qftest/qftest-3.5.7/lib/png.jar:/usr/local/qftest/qftest-3.5.7/lib/jython.jar:/usr/local/qftest/qftest-3.5.7/lib/jniwrapper.jar:/usr/local/qftest/qftest-3.5.7/lib/jline.jar:/usr/local/qftest/qftest-3.5.7/lib/jansi.jar:/usr/local/qftest/qftest-3.5.7/lib/groovy-all.jar:/usr/local/qftest/qftest-3.5.7/lib/gnu.jar:/usr/local/qftest/qftest-3.5.7/lib/bsf.jar: de.qfs.apps.qftest.start.QFTestRunner -shellarg=-c -shell=/bin/sh -options=/usr/local/qftest/qftest-3.5.7/bin/qftest.options -logfile=/usr/local/qftest/log/qftest.log -licenseserver

编辑1: 读完这篇文章后lsof 不返回同一用户打开的文件,我认为可能创建了一个交换文件,但是在写入模式下 lsof -p 30372 输出中没有 REG 文件。

此外,没有从此进程创建其他子进程。

但输出显示许多如下所示的文件打开用于写入:

java    30732 qftest   40r     FIFO        0,6          490757310 pipe
java    30732 qftest   41w     FIFO        0,6          490757310 pipe
java    30732 qftest   42r     0000       0,11        0 490757311 eventpoll
java    30732 qftest   43r     FIFO        0,6          490757312 pipe
java    30732 qftest   44w     FIFO        0,6          490757312 pipe
java    30732 qftest   45r     0000       0,11        0 490757313 eventpoll
java    30732 qftest   46r     FIFO        0,6          490757314 pipe
java    30732 qftest   47w     FIFO        0,6          490757314 pipe
java    30732 qftest   48r     0000       0,11        0 490757315 eventpoll

我不知道这里的 eventpoll 是什么,但我认为它正在从 eventpoll 读取日志,并且日志文件似乎被分成几个(不知道它是什么)并正在写入。这就像多个进程正在读取事件并以某种我真的不知道的方式写入同一个文件。

答案1

程序打开的文件在 所使用的内核数据结构中可见lsof,数据在内部缓冲,并且文件系统仅在程序关闭文件时才强制保持最新。

PIPE用于将数据从一个进程传递到另一个进程,这是 UNIX/Linux/*BSD/... 的基础

eventpoll用于同步、监控多个数据源(例如键盘和网络活动)。

从...开始

man -k open
man -k pipe
man -k event
man -k poll
man -k select

并阅读这些man页面。

你并不是处在一个由曲折的小通道组成的迷宫中,所有这些都是一样的。只是看起来像而已。

请阅读如何提出好问题帖子。

相关内容