프로세스 트리 생성

프로세스 트리 생성

나는 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입력을 생성하는 데 사용됩니다.

관련 정보