프로세스당 열려 있는 파일 수를 가져오려고 할 때 lsof 명령과의 차이점

프로세스당 열려 있는 파일 수를 가져오려고 할 때 lsof 명령과의 차이점

각 프로세스에서 열린 파일 목록을 얻으려고합니다. 나는 다음 줄을 실행했다펄 몽크스:

lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'

프로세스 이름 및 PID와 함께 열려 있는 총 파일 수를 반환합니다. 결과는 오름차순으로 정렬되며 마지막 행은 다음과 같습니다.

1065702 java:15437

따라서 이를 실행하면 lsof -p 15437동일한 숫자가 반환될 것으로 예상하지만 다음과 같은 결과를 얻습니다.

$ lsof -p 15437 | wc -l
403

왜 차이가 있나요?

부록

세 번째 차이점 원인:

$ cd /proc/15437/fd
$ ls -1 | wc -l
216

답변1

lsof인수를 사용하지 않으면 프로세스당 모든 스레드에 대한 정보가 제공됩니다.

대신 lsof -p "$pid"프로세스의 열린 파일만 나열됩니다.

동일한 번호를 얻으려면 다음이 필요합니다.

lsof -a -K -p "$pid"

또한 lsof파일 설명자에 열려 있는 파일뿐만 아니라 매핑된 파일(그림 참조 /proc/*/task/*/maps), 현재 작업 디렉터리(그림 참조 /proc/*/task/*/cwd), 루트 디렉터리( 그림 참조 /proc/*/task/*/root)도 나열합니다.

관련 정보