17

コマンドpstree PIDは、 で指定されたプロセスのすべてのサブプロセス情報を表示できますPID。ただし、 process のすべての親プロセス情報も知りたいのですがPID、どうすれば取得できますか?

例:

初期化
|- 親プロセス
| | `- current_process
| | |- subprocess_1
| | `- subprocess_2
`- その他のプロセス

私が欲しいのは、私が実行したときpstree current_process_pid、以下の出力を得たいということです:

初期化
`- 親プロセス
    `- current_process
       |- subprocess_1
       `- subprocess_2

を実行するpstree subprocess_1_pidと、次のように出力されます。

初期化
`- 親プロセス
    `- current_process
       `- subprocess_1
4

2 に答える 2

18
# With my psmisc 22.20:
pstree -p -s PID

たぶんps-efを使用する場合:

awk -vPID=$1 '
function getParent ( pid ) {
    if (pid == "" || pid == "0") return;
    while ("ps -ef | grep "pid | getline) {
        if ($2 == pid) {
            print $8"("$2") Called By "$3;
            getParent($3);
            break;
        }
    }
    close ("ps -ef")
}

BEGIN { getParent(PID) }
'

これは、psの出力列と順序を想定すると醜いです。実際、ps -efを1回実行すると、必要なすべての情報が含まれます。これは時間の価値がありません、私はまだpsmiscを更新することをお勧めします、それは害はありません。

編集:シングルランps -efを使用したミミック:

ps -ef | awk -vPID=$1 '
function getpp ( pid, pcmd, proc ) {
    for ( p in pcmd ) {
        if (p == pid) {
            getpp(proc[p], pcmd, proc);
            if (pid != PID) printf("%s(%s)───", pcmd[pid], pid);
        }
    }
}

NR > 1 {
    # pid=>cmd
    pcmd[$2] = $8;
    # pid=>Parent
    pproc[$2] = $3;
}

END {
    getpp(PID, pcmd, pproc);
    printf "\n";
    system("pstree -p "PID);
}'
于 2012-10-12T05:03:32.363 に答える