すべての場合において、読み取りまたは書き込み用に開かれたすべてのファイルが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
ページを読んでください。
あなたは曲がった小さな通路の迷路にいません。すべて同じです。ただそうだ。
良い質問をする方法の記事を読んでください。