在所有情况下,我发现任何打开以进行读取或写入的文件都会显示在 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
页面。
你并不是处在一个由曲折的小通道组成的迷宫中,所有这些都是一样的。只是看起来像而已。
请阅读如何提出好问题帖子。