プロセスツリーの作成

プロセスツリーの作成

私は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=

これにより、ファイルに保存し、必要に応じて手動で編集できる2つの数値列が提供されます。これの利点は、実際の実行システムでプログラム入力を提供して生成することが容易であることです。

その後、この数字を読み取ってツリーと同じように出力する最小限のプログラムを作成できます。

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入力を生成するために使用されます。

関連情報