2016-07-06 37 views
1

我想找到頂級的CPU使用率PID,我的劇本是在這裏:如何使用`ps`來查找命令行?

#!/bin/sh 
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'` 
echo $ppid 
ps aux|grep $ppid 

,但我得到一個錯誤:

grep: Unmatched [ or [^

爲什麼?我該如何解決它?

+0

'$ ppid'是否包含'['?它應該逃脫,因爲它是一個特殊的字符。 – SilentMonk

+0

我使用「echo $ ppid」cmd,但只顯示一些數字。 –

+0

這對我來說是有效的(對於有限的測試)。如果某種「ppid」被設置爲某種奇怪的東西,那麼你應該在任何地方引用它(無論如何,都是很好的標準做法)。即而不是'echo $ ppid'說'echo「$ ppid」'並且在'grep'中。 – MAP

回答

0

當一切都失敗,請檢查輸入:

$ top -n 1 | awk 'NR==8 {print $1 ": " $2}' | hexdump -C 
00000000 1b 28 42 1b 5b 6d 1b 5b 31 6d 31 38 37 31 35 3a |.(B.[m.[1m18715:| 
00000010 20 6a 6b 6c 6f 77 64 65 6e 0a     | jklowden.| 
0000001a 

(我縮短你的命令幾乎結合了sed和awk可以只用AWK然後我說第二個字段可以更好地表達每一個命令,所以。我們可以看到發生了什麼。)

結果是不確定的。 top將突出顯示更改的行;要做到這一點,它會發出一個ANSI轉義序列。如果你抓住一個,你會捕捉序列 - ESC(B ESC [M ESC [1分 - 這看起來會很奇怪確實PS在該序列的括號無疑激起了你的錯誤消息。

爲了解決這個問題,你頂部可能有一個一批模式,在礦山,top -n 1 -b的伎倆。

How to use ps to find a command line?

我afrai d最好的答案是RTFM。 ps是這些命令之一,在系統中有很多變化。我的GNU版本喜歡這樣的:

$ ps -c -f -p $(top -n 1 -b | awk 'NR==8 {print $1}') 
UID  PID PPID CLS PRI STIME TTY   TIME CMD 
root  1300  1 TS 19 Jun30 ?  00:14:46 /usr/bin/python /usr/bin/la 

其他意見:

  • 身高:$()以反引號
  • 雖然這種事情是好的學習,尋找那些不涉及從解析輸出解決方案交互式工具。在手冊中的帳戶下,您將找到獲取更多信息的方法,而不僅僅是命令行,此時將會處於頂部。

HTH。

+0

top -n 1 -b。它的工作,謝謝 –

0

因爲你的PPID檢索空值 改變你的命令檢索PPID值,如下

top -n 1 | sed -n 8p | awk -F " " '{print$2}' 

與其他的事情發生,這是頂過程將立即結束

這是我的Ubuntu 14.04 os。

+0

打印僅$ 2獲取用戶,而不是pid –

+0

打印$ 1的輸出是什麼?如果是pid,則更改回答$ 1 – LOKESH

1

好的!我找到了!問題在於top在其輸出中包含終端控制序列。所以你實際上並沒有看到它的回聲,但我注意到,因爲它已經把我的終端會話放大了輸出,後來我試圖弄清楚它是如何發生的,我將它追溯到我對這個問題的測試。所以,[grep抱怨的是ppid被設置的轉義序列。我周圍的工作由AWK後加入|tr -dc 0-9,即

ppid=`top -n 1 |sed -n 8p |awk '{print $1}'|tr -dc 0-9` 

這將刪除任何東西,這不是在最後一個數字。但我認爲sed也需要調整。而且,我懷疑有些數字可能來自轉義序列,因此您需要想出更清晰的方法來消除轉義序列。

但是,歸根結底,這將是無用的。每次運行該管道時,CPU的最高用戶是其中的一部分,即top進程。回想起來,這可能並不奇怪。