편집: 특정 사용 사례: 모든 하위 항목 가져오기

편집: 특정 사용 사례: 모든 하위 항목 가져오기

pstree많은 코드나 끔찍한 구문 분석 없이 기계가 읽을 수 있는 기계 출력의 출력을 얻을 수 있는 좋은 방법이 있습니까 ?

나는 정말로 모든 하위 프로세스의 목록을 원합니다.

편집: 특정 사용 사례: 모든 하위 항목 가져오기

> useful_pstree $PID

1010
1012
10101
1013

보다 일반적인 사용 사례에서는 아름다운 JSON을 얻을 수 있습니다.

# json_pstree $PID

 { 'pid': 1010,
       children: { ...

하지만... 저는 명령줄에서 json 구조에 대한 재귀를 쉽게 수행하는 좋은 방법을 잘 모릅니다(à la jq).

답변1

ps다음은 인수로 제공된 프로세스에서 시작하여 하위 프로세스에서 반복적으로 출력을 인쇄하는 쉘 스크립트입니다. 스크립트에는 오류 검사가 부족하므로 ps원하는 출력에 따라 몇 가지 옵션을 추가 해야 할 수도 있습니다 .

#!/bin/sh

printps() {
    if [ $# -gt 0 ]
    then
        ps --no-headers $*
        for p in $*; do
            printps $(cat /proc/$p/task/$p/children)
        done
    fi
}

printps $1

답변2

pgrep상위 PID별 필터링을 지원하는 버전이 있는 경우 이를 사용하여 이 목록을 얻을 수 있습니다. 예를 들어:

$ pstree -pa 1058
terminator,1058 /usr/bin/terminator
  ├─sudo,1249 -i
  │   └─zsh,1252
  ├─zsh,1250
  │   └─wget,26232 --continue --input-file=-
  ├─zsh,28482
...

bash 배열 sum 을 사용하여 pgrep트리의 너비 우선 순회를 수행합니다.

$ pids=( 1058 ); for ((i=0; i < ${#pids[@]}; i++)); do pids+=( $(pgrep -P ${pids[$i]}) ); done; printf "%s\n" "${pids[@]}"
1058
1249
1250
28482
1252
26232
29138
...

사용 중인 항목에 따라 를 사용하거나 ps볼 수도 있습니다 /proc.

pstree나는 기계가 읽을 수 있는 출력을 인쇄하는 옵션이 없는 최신 버전(GNU, 23.1)을 가지고 있습니다 .

관련 정보