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)을 가지고 있습니다 .