lsof를 사용하여 상위 프로세스와 해당 하위 프로세스가 연 모든 파일을 나열하는 방법은 무엇입니까?

lsof를 사용하여 상위 프로세스와 해당 하위 프로세스가 연 모든 파일을 나열하는 방법은 무엇입니까?
lsof -p PID

이는 단일 프로세스에서 열린 모든 파일을 나열하는 데는 잘 작동하지만 특정 기본 프로세스와 해당 하위 프로세스에서 현재 열려 있는 모든 파일을 나열해야 합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까? 이것이 가능하지 않다면 lsof이를 달성하기 위해 어떤 다른 방법을 사용할 수 있습니까?

답변1

(직계) 하위 항목 에 대해 $pid다음을 수행할 수 있습니다.

lsof -p "$({ echo "$pid"; pgrep -P "$pid"; } | paste -sd , -)"

pgrep, like는 lsof표준 명령은 아니지만 이제 많은 시스템에서 발견됩니다.

pstree모든 자손(자식, 손자 등) 에 대해 pid 목록을 얻는 데 사용할 수 있지만 출력을 안정적으로 구문 분석할 수 없기 때문에 이는 완벽하지는 않습니다. 다음과 같은 도우미 기능을 사용할 수 있습니다.

descendants() {
  ps -Ao pid= -o ppid= | PID=$1 perl -lae '
    push @{$children{$F[1]}}, $F[0];
    sub tree {
      my @pids=($_[0]);
      push @pids, tree($_) for @{$children{$_[0]}};
      return @pids;
    }
    END{print for tree $ENV{PID}}'
}

그런 다음 전화하십시오.

lsof -p "$(descendants "$pid" | paste -sd, -)"

답변2

세미 핸드메이드 패션:

$ pstree -p PID

위에서 PID 수집

$ lsof -p pid1,pid2,pid3,...

또는 출력이 ps --ppid 1413 -o pid=비어 있을 때까지 반복하여 pid 목록을 수집합니다.

답변3

lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | grep PARENT_PID

lsof는 상위 및 하위 프로세스의 열린 파일을 나열할 수 있기 때문입니다. 두 번째 열의 출력은 상위 프로세스입니다.

관련 정보