dummy.sh
pid 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/어린이