2014-07-16 43 views
1

我對shell腳本非常陌生,我試圖獲取進程的內存和CPU利用率。將來我會從java程序運行這個腳本,以便我可以使用該java程序的所有子進程。我的劇本目前看起來像作爲無法使用shell腳本獲取進程信息

#!/bin/bash 
# get the process Id of the program executing this shell script 
ID=$PPID 
echo the process id of the parent of this script is $ID 

#fetch the parent of the program which executed this shell 
PID=`ps -o ppid=$ID` 
echo the grand parent id of the script is $PID 

# traverse through all children and collect there memory/cpu utiliation information 
for p in `pgrep -P $PID`; do 
top -c -n 1 -p $p > /tmp/stat.log 
done 

現在,當我運行這個程序我得到以下輸出

the process id of the parent of this script is 5331 
the grand parent id of the script is 5331 3173 5331 6174 
    top: bad pid 'Usage:' 

    top: bad pid 'pgrep' 

    top: bad pid '[-flvx]' 

    top: bad pid '[-d' 

    top: bad pid 'DELIM]' 

    top: bad pid '[-n|-o]' 

    top: bad pid '[-P' 

    top: bad pid 'PPIDLIST]' 

    top: bad pid '[-g' 

    top: bad pid 'PGRPLIST]' 

    top: bad pid '[-s' 

    top: bad pid 'SIDLIST]' 

    top: bad pid '[-u' 

    top: bad pid 'EUIDLIST]' 

    top: bad pid '[-U' 

    top: bad pid 'UIDLIST]' 

    top: bad pid '[-G' 

    top: bad pid 'GIDLIST]' 

    top: bad pid '[-t' 

    top: bad pid 'TERMLIST]' 

    top: bad pid '[PATTERN]' 

可能有人請幫助我。

+0

我很抱歉,但就像我說的,你必須給'PPID ='和'「$ ID」'之間的空間: 'PID = $(ps -o ppid =「$ ID」| egrep'\ S +')'。哦,是的,我忘了你必須添加'-o':'PID = $(ps -o ppid =「$ ID」| egrep -o'\ S +')' – konsolebox

+0

另外,如果你真的使用bash, <(exec ps -o ppid =「$ ID」)'可能會更好。 – konsolebox

回答

1
PID=`ps -o ppid=$ID` should have had a space between `ppid=` and `$ID`. 

適當的形式(以及引用的論據和反引號以上寧願$()):

PID=$(ps -o ppid= "$ID") 

但不會修剪出輸出上的前導空格。正如我曾建議,使用讀:

read PID < <(exec ps -o ppid= "$ID") 

或者,如果你喜歡,你可以修剪出具有egrep空間:

PID=$(ps -o ppid= "$ID" | egrep -o '\S+') 

使用擴展模式匹配可能是複雜的給你:

shopt -s extglob 
PID=$(ps -o ppid= "$ID") 
PID=${PID##+([[:blank:]])} 

for線也可以做得更好:

while read -u 4 P; do 
    top -c -n 1 -p "$P" > /tmp/stat.log 
done 4< <(exec pgrep -P "$PID") 

而且我覺得你的意思是輸出重定向到/tmp/stat.log作爲一個塊:

while read -u 4 P; do 
    top -c -n 1 -p "$P" 
done 4< <(exec pgrep -P "$PID") > /tmp/stat.log 
+0

我試過你的腳本,現在grandparentId是空的而不是打印任何東西,但是感謝你的幫助 – Ashish

+0

@Ashish你試過了哪一個?我剛剛更新了egrep。它應該是'\ S +'。 – konsolebox

+0

我已經嘗試過s和S,我將在我的問題中加入 – Ashish