하위 프로세스 목록을 우아하게 가져옵니다.

하위 프로세스 목록을 우아하게 가져옵니다.

에서 상속받는 모든 프로세스(예: 자식, 손자 등)의 목록을 얻고 싶습니다 $pid. 이것이 내가 생각해낸 가장 간단한 방법입니다.

pstree -p $pid | tr "\n" " " |sed "s/[^0-9]/ /g" |sed "s/\s\s*/ /g"

전체 목록을 얻는 명령이나 더 쉬운 방법이 있습니까?모두후손 과정?

답변1

다음 명령은 약간 더 간단하며 명령 이름의 숫자를 무시할 수 있다는 추가 이점이 있습니다.

pstree -p $pid | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

또는 Perl을 사용하십시오.

pstree -p $pid | perl -ne 'print "$1\n" while /\((\d+)\)/g'

우리는 괄호 안의 숫자를 찾고 있으므로 그것을 만났을 때 하위 프로세스로 2가 주어지지 않습니다 gif2png(3012). 그러나 명령 이름에 대괄호가 포함된 숫자가 포함되어 있으면 모두 실패합니다. 텍스트 처리는 많은 도움이 될 수 있습니다.

그래서 저는 또한 프로세스 그룹이 갈 길이라고 생각합니다. 프로세스를 자체 프로세스 그룹에서 실행하려면 데비안 패키지 "daemontools"의 "pgrphack" 도구를 사용할 수 있습니다:

pgrphack my_command args

아니면 Perl을 다시 사용할 수도 있습니다:

perl -e 'setpgid or die; exec { $ARGV[0] } @ARGV;' my_command args

여기서 주목해야 할 유일한 점은 프로세스 그룹이 중첩되지 않는다는 것입니다. 따라서 프로세스가 자체 프로세스 그룹을 생성하는 경우 해당 하위 프로세스는 더 이상 생성한 그룹에 포함되지 않습니다.

답변2

descendent_pids() {
    pids=$(pgrep -P $1)
    echo $pids
    for pid in $pids; do
        descendent_pids $pid
    done
}

답변3

정확성 문제도 있다. 출력을 순진하게 구문 분석pstree여러 가지 이유로 문제가 있습니다.

  • pstree 쇼 PID그리고스레드의 ID(이름은 중괄호 안에 표시됨)
  • 명령 이름에는 중괄호, 괄호 안에 숫자가 포함되어 안정적인 구문 분석이 불가능할 수 있습니다.

Python이 있고psutil패키지를 설치한 후 이 코드 조각을 사용하여 모든 하위 프로세스를 나열할 수 있습니다.

pid=2235; python3 -c "import psutil
for c in psutil.Process($pid).children(True):
  print(c.pid)"

(예를 들어 psutil 패키지는 tracerFedora/CentOS에서 사용할 수 있는 명령에 대한 종속성으로 설치됩니다.)

또는 Bourne 쉘에서 프로세스 트리의 너비 우선 순회를 수행할 수 있습니다.

ps=2235; while [ "$ps" ]; do echo $ps; ps=$(echo $ps | xargs -n1 pgrep -P); \
  done | tail -n +2 | tr " " "\n"

pid의 전이적 폐쇄를 계산하려면 꼬리를 생략할 수 있습니다.

위 코드는 재귀를 사용하지 않으며 ksh-88에서도 실행됩니다.

Linux에서는 다음을 제거할 수 있습니다.pgrep전화해서 다음 정보를 읽어보세요 /proc.

ps=2235; while [ "$ps" ]; do echo $ps ; \
  ps=$(for p in $ps; do cat /proc/$p/task/$p/children; done); done \
  | tr " " "\n"' | tail -n +2

이는 각 PID에 대한 분기/실행을 저장하고 pgrep각 호출에 대해 추가 작업을 수행하기 때문에 더 효율적입니다.

답변4

내가 찾은 가장 짧은 버전은 다음 명령도 올바르게 처리합니다 pop3d.

pstree -p $pid | perl -ne 's/\((\d+)\)/print " $1"/ge'

명령에 다음과 같은 이상한 이름이 있으면 my(23)prog잘못 처리됩니다.

관련 정보