Bash - 6개 이상의 하위 항목이 있는 프로세스의 PID를 나열하시겠습니까?

Bash - 6개 이상의 하위 항목이 있는 프로세스의 PID를 나열하시겠습니까?

dummy.shpid 101과 7개의 하위 항목이 있는 프로세스가 있다고 가정합니다 .

pstree -pc 101
dummy(101)──dummy(102)──dummy(103)──dummy(104)──dummy(105)──dummy(106)──sleep(107)

그러나 6개 이상의 하위 항목(우리의 경우 dummy.sh 101)이 있는 Bash 스크립트에서 모든 프로세스의 PID를 얻는 방법은 무엇입니까? 나는 자식 프로세스가 6보다 작은 PID를 갖는 것을 원하지 않습니다.

시도했지만 PS -u myuser모든 사용자 프로세스만 표시됩니다. 하지만 하위 항목이 6보다 큰 사용자 프로세스의 PID를 얻는 방법은 무엇입니까?

고쳐 쓰다:

예를 들어, 아래 재귀 스크립트를 사용하여 7개의 직계 자손 체인을 트리거합니다. 6개 이상의 자손이 있기 때문에 PID 101을 얻고 싶습니다.

마찬가지로 이 더미 프로세스는 dummy(101)의 부모가 될 bash(100) 터미널에 의해 트리거되므로 Pid 100도 필요합니다(6개 이상의 하위 항목을 갖는 기준도 충족하므로). bash(100)──dummy(101)──dummy(102).....dummy(107)

#!/bin/bash

if [[ "$#" -ne 1 ]]; then
    set -- 7
fi

if [[ "$1" -gt 2 ]]; then
    echo 'descendant process' "$1"
    "$0" "$(($1 - 1))"
else
    sleep 500
fi

기준: 나는 명령에 의해 반환된 PID만을 고려하겠습니다 ps -u $USER -o pid. 내 요구 사항은 사용자 전처리를 고려하는 것이기 때문입니다. 사용자 프로세스에 6개 이상의 하위 항목이 있는지 확인하기 위해 이를 반복할 것입니다. 하지만 제 질문은 특정 PID에 대한 하위 항목 수를 찾는 방법입니다.

답변1

이 작업을 수행하는 더 효율적인 방법이 있다고 확신하지만 다음과 같이 작동합니다.

#!/bin/bash

declare -A procs
ps -u $USER --no-headers -o pid,ppid | (

    # build an associate array that maps pids to parent pids
    while read pid ppid ; do
        procs[$pid]=$ppid
    done

    # for each process, walk up the tree, counting processes
    for pid in "${!procs[@]}"; do
        save_pid=$pid
        depth=0
        while :; do
            ppid=${procs[$pid]}
            [[ $ppid ]] || break

            let depth++
            pid=$ppid
        done
        if (( depth > 6 )); then
            echo $save_pid
        fi
    done
)

답변2

/proc 파일 시스템을 찾아볼 수도 있습니다. 실행 중인 각 프로세스에는 모든 직계 자손이 공백으로 구분되어 나열되는 "children"이라는 파일이 있습니다.

예를 들어 프로세스 12345의 경우 다음 위치에서 하위 프로세스에 대한 정보를 찾을 수 있습니다.

/proc/12345/작업/12345/어린이

관련 정보