열려 있는 모든 파일이 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, 데이터는 내부적으로 버퍼링되며, 파일 시스템은 프로그램이 파일을 닫을 때만 최신 상태로 유지됩니다.

PIPEUNIX/Linux/*BSD/...의 기반이 되는 한 프로세스에서 다른 프로세스로 데이터를 전달하는 데 사용됩니다.

eventpoll여러 데이터 소스(예: 키보드 및 네트워크 활동)를 동기화하고 모니터링하는 데 사용됩니다.

에서 시작하다

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

그리고 이 man페이지들을 읽어보세요.

당신은 구불구불한 작은 통로의 미로에 있는 것이 아닙니다. 모두 똑같습니다. 그냥 그럴 것 같습니다.

좋은 질문을 하는 방법 게시물을 읽어보세요.

관련 정보