2010-10-31 82 views
0

我使用下面的腳本來獲取正在運行的進程,打印編號,命令..問題使用awk和grep


if [ "`uname`" = "SunOS" ] 
then 
    awk_c="nawk" 
    ps_d="/usr/ucb/" 
    time_parameter=7 
else 
    awk_c="awk" 
    ps_d="" 
    time_parameter=5 
fi 

main_class=RiskEngine 
connection_string=db.regression 

AWK_CMD='BEGIN{printf "%-15s %-6s %-8s %s\n","ID","PID","STIME","Cmd"} {printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter, main_class, connection_string, port}' 

while getopts ":pnh" opt; do 
    case $opt in 
    p) AWK_CMD='{ print $2 }' 
     do_print_message=1;; 
    n) AWK_CMD='{printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter,main_class, connection_string, port}' ;; 
    h) print "usage : `basename ${0}` {-p} {-n} : Returns details of process running " 
     print " -p : Returns a list of PIDS" 
     print " -n : Returns process list without preceding header" 
     exit 1 ; 

    esac 
done 

ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_ 
string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD" 

# cat /etc/redhat-release 
Red Hat Enterprise Linux AS release 4 (Nahant Update 6) 
# uname -a 
Linux deapp25v 2.6.9-67.0.4.EL #1 Fri Jan 18 04:49:54 EST 2008 x86_64 x86_64 x86_64 GNU/Linux 

當我執行從以下腳本獨立或內部腳本

# ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD" 

我得到兩行Linux:

ID    PID STIME Cmd 
MY_APP  6217 2355352 RiskEngine 10348 
MY_APP  21874 5316  RiskEngine 10348 

我只有一個jvm(Java命令)在後臺運行,但仍然看到2行。

我知道其中的一個(與pid 21874重複)來自我正在執行的awk命令。它再次包括主要類和端口兩行。你能幫我避免重複行嗎?

你能幫我嗎?

回答

0

您已經在代碼中使用了grep -v grep技巧,爲什麼不更新它以排除awk流程以及grep -v ${awk_c}

換句話說,你的腳本的最後一行將(在一行,並與實際命令參數awk而非blah blah blah):

ps auxwww 
    | grep $main_class 
    | grep 10348 
    | grep -v grep 
    | grep -v ${awk_c} 
    | ${awk_c} -v blah blah blah 

這將確保進程列表不會包含在其中的單詞awk

請記住,這樣做並不總是一個好主意(誤報),但是,由於您已經在使用包含grep的進程承擔風險,因此您最好還是使用包含awk的進程。

0

我已將代碼重新格式化爲代碼,但您需要了解返回鍵是您的朋友。可怕的長管道應該分成多行 - 我通常在管道中每個命令使用一行。您也可以在多行上編寫awk腳本。這使您的代碼更具可讀性。

然後,您需要向我們解釋您所要做的。

然而,很可能使用的是「AWK」作爲上grep的變體,並發現該值10348(可能意味着對一些命令行端口號)也是在ps輸出作爲一個參數awk(因爲是'main_class'的值),所以你可以獲得額外的信息。您需要修改awk腳本以消除(忽略)包含'awk'的行。

請注意,如果發生PID或PPID等於10348的進程運行,您仍然可以通過在端口9999上運行主類的命令(任何非10348的值)要徹底完成這項工作,那麼'awk'腳本只需要分析該命令的'命令加選項'部分。

2

AWK可以爲你做所有的事情。

這裏是的AWK命令如何可以選擇性的簡單示例:

ps auxww | awk -v select="$mainclass" '$0 ~ select && /10348/ && ! (/grep/ || /awk/) && {print}' 

ps可以由有選擇地輸出場,這將有助於一個小以減少誤報。但是pgrep可能對您更有用,因爲您真正使用的是結果中的PID。

pgrep -f "$mainclass.*10348" 
0

您可以在所有的awk參數的個數前面加上這個簡單的代碼: '!/ awk的/ {.... awk的原代碼....}'

「 !/ awk /'將會告訴awk忽略任何包含字符串awk的行。

你也可以刪除你的 'grep的-v' 如果你擴展我的awk的建議到是這樣的: '!/ awk的/ & &/grep的/ {...原來的awk代碼...}'