`lsof`는 열린 파일 설명자의 파일 이름을 어떻게 추적합니까?

`lsof`는 열린 파일 설명자의 파일 이름을 어떻게 추적합니까?

파일 이름을 바꾸면 lsof새 이름이 나타나는 것을 확인했습니다.

이를 테스트하기 위해 스크립트가 생성되었습니다 python.

#!/bin/python
import time

f = open('foo.txt', 'w')
while True:
  time.sleep(1)

이름 변경을 확인한 후 lsof:

$ python test_lsof.py &
[1] 19698

$ lsof | grep foo | awk '{ print $2,$9 }'
19698 /home/bfernandez/foo.txt

$ mv foo{,1}.txt

$ lsof | grep foo | awk '{ print $2,$9 }'
19698 /home/bfernandez/foo1.txt

전화번호를 통해서일 수도 있겠다는 생각이 들었습니다 inode. 이를 테스트하기 위해 파일에 대한 하드 링크를 만들었습니다. 그러나 lsof원래 이름은 계속 표시됩니다.

$ ln foo1.txt foo1.link

$ stat -c '%n:%i' foo*
foo1.link:8429704
foo1.txt:8429704

$ lsof | grep foo | awk '{ print $2,$9 }'
19698 /home/bfernandez/foo1.txt

그리고 원본 파일을 삭제하면 lsof해당 파일에 대한 기존 하드 링크가 여전히 있음에도 불구하고 해당 파일은 삭제된 것으로 표시됩니다.

$ rm foo1.txt
rm: remove regular empty file ‘foo1.txt’? y

$ lsof | grep foo | awk '{ print $2,$9,$10 }'
19698 /home/bfernandez/foo1.txt (deleted)

그래서 드디어...

내 질문

lsof열린 파일 설명자를 추적하여 다음을 수행하는 데 사용되는 방법은 무엇 입니까?

  1. 파일 이름 변경 추적
  2. 기존 하드 링크에 대해 모릅니다.

답변1

  1. lsof커널 이름 캐시의 inode를 사용한다는 가정이 정확합니다. Linux 플랫폼에서 경로 이름은 Linux 파일 시스템에서 제공됩니다 /proc.

  2. 하드 링크 처리는자주하는 질문:

3.3.4 lsof가 "올바른" 하드 링크 파일 경로 이름을 보고하지 않는 이유는 무엇입니까?

lsof가 하드 링크가 있는 파일의 가장 오른쪽 경로 이름 구성 요소를 보고하는 경우 해당 구성 요소는 커널의 이름 캐시에서 나올 수 있습니다. 열린 파일을 커널 이름 캐시에 연결하는 키는 이름이 다른 하드 링크마다 동일할 수 있으므로,lsof는 열려 있는 모든 하드 링크 파일에 대해 하나의 이름만 보고할 수 있습니다.. 때때로 이것은 관찰자에게 "올바른" 것처럼 보입니다. 때로는 그렇지 않습니다. 커널에 중요한 파일 식별 키는 장치 번호와 노드 번호이며 모든 하드 링크 이름에 대해 동일하다는 점을 기억하십시오.

실제로 삭제된 노드의 전체 표시는 Linux(및 동일한 설명에 따르면 이후 버전의 Solaris 10)에도 적용됩니다.자주하는 질문).

관련 정보