lsof가 항상 열려 있는 파일의 확인된 절대 경로 이름을 표시하는지 여부

lsof가 항상 열려 있는 파일의 확인된 절대 경로 이름을 표시하는지 여부

의 출력에서 lsof​​이 열은 항상 열린 파일의 확인된 절대 경로 이름을 출력합니까(기호 링크 또는 경로 이름이 없다는 의미로 확인됨 NAME)?...

예를 들어, cd디렉토리에 대한 심볼릭 링크로 이동한 다음 프로그램을 실행하여 해당 디렉토리 아래의 파일을 열면 lsof파일의 확인된 절대 경로 이름만 표시됩니까?

열린 파일의 해결되지 않은 절대 경로 이름을 출력 할 수 있습니까 lsof? 해결되지 않았다는 것은 디렉터리 심볼릭 링크가 경로 이름에 있어야 함을 의미합니다.

감사해요.

답변1

옵션이 없으면 구문 분석된 형식으로 경로 이름을 제공해야 합니다. ~에서lsof(8) 매뉴얼:

열려는 파일은 일반 파일, 디렉토리, 블록 특수 파일, 문자 특수 파일, 실행 가능한 텍스트 참조, 라이브러리, 스트림 또는 네트워크 파일(인터넷 소켓, NFS 파일 또는 UNIX 도메인 소켓)일 수 있습니다. 경로별로 파일을 선택하거나 파일 시스템의 모든 파일을 선택할 수 있습니다.

물론 다음과 같은 오류가 있을 수 있습니다.경로 이름이 너무 깁니다., 이 경우 경로 이름은 구문 분석되지 않지만 명백히 다음 lsof에 따라 달라 집니다.주변의 래퍼 기능readlink(), 그 일을 해야 해.

다음과 같이 파일 이름을 지정하는 경우 lsof [options] [--] names:

이름 나열할 특정 파일의 경로 이름입니다. 심볼릭 링크는 사용하기 전에 해결됩니다. "--" 옵션을 사용하여 이전 옵션과 이름을 구분할 수 있습니다.

물론 파일 이름 구문 분석에 대한 표준 규칙이 적용됩니다. 기호 링크 수준이 너무 많습니다.오류가 발생합니다. lsofMAXSYMLINKS 변수에 따라 다름 Linux 커널에서 최대 40개의 심볼릭 링크로 하드코딩됨, 그리고변수가 정의되지 않은 다른 시스템의 경우 - 32로 설정하세요..

-b옵션을 지정하면 파일 이름이 구문 분석되지 않습니다.

셋째, lsof가 시스템 마운트 테이블에서 얻은 파일 시스템 디렉터리 이름이 기호 링크인 경우 lsof는 이러한 링크를 확인할 수 없습니다. 이는 -b 옵션을 사용하면 lsof가 기호 링크를 해결하는 데 사용하는 커널 readlink(2) 함수의 사용을 방지하기 때문입니다.

답변2

사용 중인 소켓 파일이 열린 파일로 간주되어야 하는지는 모르겠지만 유닉스 도메인 소켓의 경우 lsof나열만 되고 NAME전달만 됩니다.정밀한상대 또는 절대 소켓 바인딩의 이름과 모든 경로 아티팩트는 변경되지 않은 채로 유지됩니다.

$ cd /tmp
$ nc -dUl ./././///sock &
[3] 6324
$ ls sock /tmp/sock ./sock
./sock  /tmp/sock  sock
$ lsof sock /tmp/sock ./sock
[nothing]
$ lsof ./././///sock
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
nc      6324  XXX    3u  unix 0xffff9f9faab76000      0t0 175260 ./././///sock type=STREAM

만약에 참고하세요비추상적Unix 도메인 소켓의 경우 소켓이 바인딩되거나 연결된 경로는 커널이 이를 확인할 때까지만 중요합니다. 이는 소켓이 바인딩되거나 연결된 실제 주소인 [device,inode] 튜플입니다.

$ cd /tmp
$ nc -dUl ./././///sock &
[1] 7293
$ mv sock SOCK
$ lsof -aUp $!
COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
nc      7293   xxx    3u  unix 0xffff908d70bb5800      0t0 1137631 ./././///sock type=STREAM
$ lsof ./././///sock
lsof: status error on ./././///sock: No such file or directory
[stupid junk snipped]
$ lsof SOCK
[nothing]
$ nc -U ./././///sock
nc: unix connect failed: No such file or directory
$ nc -U SOCK
[connected ok]

lsof@다른 소켓에 "연결된"(즉, 기본 전송 주소가 설정된) 데이터그램 소켓을 찾는 것도 불가능하며 이름에 a가 있는 추상 소켓과 NUL이 있는 추상 소켓을 구별하는 것도 불가능합니다. 이름에 바이트가 있습니다. 기다려주세요.

궁금한 사람이 있을 경우를 대비해 인터페이스를 통해 필요한 모든 정보를 얻을 수 있습니다 sock_diag( 제목 UDIAG_SHOW_VFS참조 ). 이를 활용하기에는 너무 어리석 습니다 .UDIAG_SHOW_PEERlinux/unix_udiag.hlsof

참고: 이 예제에서는 Unix 소켓을 지원하는 ncDebian 패키지를 사용합니다.netcat-openbsd

관련 정보