프로세스에서 연 파일, 포트 등의 목록이 필요합니다. 이제 를 사용할 때마다 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
커널에서 반환된 정보 자체가 올바르게 구문 분석되지 않을 수도 있고, 커널이 안정적으로 구문 분석 가능한 형식으로 정보를 제공하지 못할 수도 있습니다.