나는 pstree를 과제로 구현하고 있습니다.
나는 만들고 싶다프로세스 테스트 트리, 하지만 그렇게 하려고 노력 중이에요.
나중에 스크립트를 테스트할 수 있도록 백그라운드 프로세스 트리를 만드는 것과 비슷한 작업을 시도해 보았습니다.
재귀적인 프로세스 트리
childProcess(){
echo "mine PID is: "$$
local -i level=$(expr $1 - 1) # level of recursion
if [[ $level -gt 0 ]]; then
echo $level
childProcess $level & # we do binary tree
echo "Process with PID $! launched"
childProcess $level &
echo "Process with PID $! launched"
sleep $level
echo "baf! "$level" pid is: "$$
fi
}
# create binary tree of depth 4
for (( i = 0; i < 2; i++ )); do
childProcess 4 &
echo "running proces no. :"$!
done
하지만 프로세스 내부에서 PID를 에코하고 싶지만 그럴 수 없습니다.
작동하지 않는 또 다른 솔루션은 "DFS 방식" 프로세스를 생성하는 것입니다.
declare -i level=$1
if [[ $level -gt 0 ]]; then
sh $0 $(expr $level - 1) # spawn children
sh $0 $(expr $level - 1) # spawn children
sleep 100;
echo "level :"$level" process no: "$$
fi
PID로 액세스할 수 있고 가장 오래된 프로세스를 종료하여 삭제할 때까지 존재하는 프로세스 트리를 만드는 방법을 알려주실 수 있는 분 계신가요?
답변1
현재 시스템에서 실행 중인 프로세스의 스냅샷을 찍는 것이 좋습니다. 필요한 절대 최소값은 각 PID와 해당 PPID입니다.
ps -ax -o pid=,ppid=
이렇게 하면 파일에 저장하고 필요한 경우 수동으로 편집할 수 있는 두 개의 숫자 열이 제공됩니다. 이것의 장점은 실제 실행 시스템에서 프로그램 입력을 제공하고 생성하기 쉽다는 것입니다.
그런 다음 이 숫자를 읽고 트리와 같은 방식으로 출력하는 최소한의 프로그램을 작성할 수 있습니다.
awk -v OFS='\t' '
{
ppid[$1] = $2
}
function print_pid(pid, level) {
$0 = ""
$(level+1) = pid
print
for (p in ppid)
if (ppid[p] == pid)
print_pid(p, level + 1)
}
END {
print_pid(1,0)
}'
남은 것은 실제 명령 이름 등을 출력에 추가하고(더 많은 데이터를 요청해야 함 ps
) 간단한 ASCII 그래픽으로 출력을 장식하는 것입니다.
내가 아는 한, pstree
내가 액세스할 수 있는 유틸리티는 실제로 ps
입력을 생성하는 데 사용됩니다.