2012-10-12 78 views
6

命令pstree PID可以顯示由PID指定的進程的所有子進程信息。但是,我也想知道過程PID的所有父進程信息,我怎麼能得到它?如何通過`pstree`獲取所有父進程和所有子進程

一個例子,在下面的過程:

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

我要的是,當我運行pstree current_process_pid,我想下面的輸出

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

當我運行pstree subprocess_1_pid,它將輸出

 
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的一次運行包含所有需要的信息。 這不值得花時間,我還是推薦更新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); 
}' 
+3

'-s'選項不支持我的'pstree'安裝的'psmisc-22.2-7.el5_6.2' –

+2

作爲一個助記符,我記得args是'laps',如'pstree -laps '得到分支與額外的信息。 – haridsv

2

我發現是一個溶液@haridsv(pstree -laps <pid>)提到laps選項。雖然對我來說有點冗長,所以我會堅持更短的aps輸出。

相關問題