모든 경우에 읽기 또는 쓰기를 위해 열린 모든 파일이 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
페이지들을 읽어보세요.
당신은 구불구불한 작은 통로의 미로에 있는 것이 아닙니다. 모두 똑같습니다. 그냥 그럴 것 같습니다.
좋은 질문을 하는 방법 게시물을 읽어보세요.