我想找到頂級的CPU使用率PID,我的劇本是在這裏:如何使用`ps`來查找命令行?
#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid
,但我得到一個錯誤:
grep: Unmatched [ or [^
爲什麼?我該如何解決它?
我想找到頂級的CPU使用率PID,我的劇本是在這裏:如何使用`ps`來查找命令行?
#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid
,但我得到一個錯誤:
grep: Unmatched [ or [^
爲什麼?我該如何解決它?
當一切都失敗,請檢查輸入:
$ 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。
top -n 1 -b。它的工作,謝謝 –
因爲你的PPID檢索空值 改變你的命令檢索PPID值,如下
top -n 1 | sed -n 8p | awk -F " " '{print$2}'
與其他的事情發生,這是頂過程將立即結束
這是我的Ubuntu 14.04 os。
打印僅$ 2獲取用戶,而不是pid –
打印$ 1的輸出是什麼?如果是pid,則更改回答$ 1 – LOKESH
好的!我找到了!問題在於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
進程。回想起來,這可能並不奇怪。
'$ ppid'是否包含'['?它應該逃脫,因爲它是一個特殊的字符。 – SilentMonk
我使用「echo $ ppid」cmd,但只顯示一些數字。 –
這對我來說是有效的(對於有限的測試)。如果某種「ppid」被設置爲某種奇怪的東西,那麼你應該在任何地方引用它(無論如何,都是很好的標準做法)。即而不是'echo $ ppid'說'echo「$ ppid」'並且在'grep'中。 – MAP