2012-10-12 4 views
6

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

たとえば、プロセスの下に与える:

 
init 
|- parent_process 
| `- current_process 
|  |- subprocess_1 
|  `- subprocess_2 
`- other_process 

を私が欲しいものは、私がpstree current_process_pidを実行したとき、私は私がpstree subprocess_1_pidを実行すると、それは出力

が出力されます

 
init 
`- parent_process 
    `- current_process 
     |- subprocess_1 
     `- subprocess_2 

の下に取得したいです

 
init 
`- parent_process 
    `- current_process 
     `- subprocess_1 

ありがとうございます。

多分
+0

'ps -ef'で試しましたか? – gks

+0

注:pstree/psコマンドの-lオプションを使用すると、プロセスのコマンドライン引数を含む長い行が表示されます。各プロセスのコマンドライン引数をトレースし、どのコマンド/スクリプトがトリガされるかを確認するときに役立ちます(たとえば、Web UI操作で実行されるバックエンドスクリプトを特定するなど)。 – GuruM

答えて

9
# 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の更新をお勧めします、それは傷つけることはありません。

EDIT:模倣使用して単一の実行の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); 
}' 
+3

'-s'オプションは、' psmisc-22.2-7.el5_6.2'によってインストールされた 'pstree'ではサポートされていません –

+2

ニーモニックとして、' pstree -laps 'のようにargsを' laps'として覚えています。追加情報を含むブランチ。 – haridsv

2

Iは@haridsv(pstree -laps <pid>)によって述べlapsオプションは溶液であることがわかりました。それは私のために少し冗長だったので、私は短いaps出力に固執するでしょう。

関連する問題