사용자 정의 lsof 출력

사용자 정의 lsof 출력

프로세스에서 연 파일, 포트 등의 목록이 필요합니다. 이제 를 사용할 때마다 lsof -p <PID>Python 스크립트에서 출력을 구문 분석할 수 있지만 문제는 가끔 빈 열이 표시된다는 것입니다. 따라서 출력을 구문 분석할 때 잘못된 결과가 나타납니다.

각 프로세스에 대해 /proc에서 FD를 수동으로 찾을 수 있다는 것을 알고 있지만 이는 POSIX와 호환되어야 합니다. 그래서 내 질문은 lsof인쇄 할 수 있는 방법이 있느냐는 것입니다.오직열린 파일 목록만 있고 다른 것은 없나요?

저는 출력에 어떤 명령이 나타날지 지정할 수 있는 사용자별 ps명령( ) 과 같은 것을 생각하고 있습니다 . 이 경우 출력에 "name" 열만 지정 ps -eopid,user,comm,command하고 싶습니다 .lsof -p <PID>

답변1

lsof하나 있다"재처리 가능"옵션이 있는 출력 형식 -F(참조다른 프로그램의 출력섹션).

lsof -nPMp "$pid" -Fn | sed '
  \|^n/|!d
  s/ type=STREAM$//; t end
  s/ type=DGRAM$//; t end
  s/ type=SEQPACKET$//
  : end
  s|^n||'

파일 시스템의 경로로 확인되는 열린 파일이 나열됩니다.

  • -nPM기본적으로 발생하는 일부 lsof처리를 비활성화하지만 IP 주소, 포트 또는 rpc 이름 확인과 같이 여기서는 신경 쓰지 않습니다.
  • -p "$pid", 열린 파일을 나열할 프로세스를 지정합니다.
  • -Fn: 필드 출력을 통해. 묻다N나의 일부.
  • | sed후처리 sed에서는 관심 있는 부분만 선택합니다.
  • \|^n/|!d: 다음으로 시작하지 않는 콘텐츠는 건너뜁니다.n/
  • s/ type=...$/;t end: 줄 끝의 해당 문자열을 삭제하고 end성공하면 레이블로 이동합니다.
  • : end: end라벨.
  • s|^n||: 출력 중인 필드를 식별하기 위해 삽입된 선행 n문자를 제거합니다.lsof

그러나 파일 이름에 인쇄할 수 없는 문자는 모호한 방식(예: \n개행, ^[ESC...)으로 인코딩됩니다(예: in은 ^[문자 ^[와 ESC를 의미할 수 있음).

또한 삭제된 파일의 경우 적어도 Linux에서는 파일 경로를 얻을 수 있지만 추가됩니다 (deleted). 마찬가지로, 삭제 (deleted)된 파일이 다른 곳에 연결될 수 있으므로 링크 수를 보는 것이 반드시 도움이 되는 것은 아닙니다.

type=*또한 파일 이름에 실제로 나타날 수 있는 Unix 도메인 소켓을 제거한 내용도 참조하세요.

이는 대부분의 경우 작동하지만 일반적으로 출력을 안정적으로 사후 처리할 수 없음을 의미합니다.

언급 할 필요없는lsof커널에서 반환된 정보 자체가 올바르게 구문 분석되지 않을 수도 있고, 커널이 안정적으로 구문 분석 가능한 형식으로 정보를 제공하지 못할 수도 있습니다.

관련 정보