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