각 프로세스에서 열린 파일 목록을 얻으려고합니다. 나는 다음 줄을 실행했다펄 몽크스:
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
)도 나열합니다.