Bash - 6つ以上のサブアイテムを持つプロセスのPIDを一覧表示しますか?

Bash - 6つ以上のサブアイテムを持つプロセスのPIDを一覧表示しますか?

dummy.shpid 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
)

おすすめ記事