2013-03-30 63 views
1

我不是一個軟件/腳本民間自己這麼努力理解正在發生的事情在這裏:這個命令有什麼問題?

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }'' 

基本上我想打印我的SNMP守護進程的駐留集大小值5次(公平解析度)。然後,我打算從此構建將輸出重定向到文本文件以供稍後分析,例如,我可以將數據放入圖形中。

麻煩我這裏是我可以運行以下罰款:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss' 

不過,我需要的只是數值只所以採用AWK剝離出來的一切,但該值是非常重要的。

運行上面的第一個命令返回一個錯誤,我懷疑是由於道路觀看是處理單引號,但我不夠聰明去了解它....

有什麼建議?

而且,我也讀了這

pmap -x [pid] 

工作過,但是當我用SNMPD的各自的PID輸出運行爲零時,顯然事實並非如此。任何想法呢?

問候。

回答

1

如果引用的命令是準確的:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }'' 
      ^   ^^      ^       ^^ 
      1    0 1       0       10 

你有你的單引號的問題。 1表示「開始報價」,0表示報價結束。下面的命令行應爲你工作:

watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += $1 } END { print i }"' 
      ^                  ^
      1                   0 

雙引號和$(...)也正常工作。單引號字符串作爲一個整體發送到watch。以前,你有多個參數。

注意,在你的工作命令,你必須:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss' 
      ^   ^^    ^
      1    0 1     0 

現在,因爲中間的「01」之間的字符是一個逗號,不是空白,外殼繼續給watch一個參數,但它不包含引號。得到什麼watch作爲其第三個說法是:

ps -p $(pgrep -d, -xsnmpd) -o rss 

有了您的awk直插,1watch`遇到多個參數:

ps -p $(pgrep -d, -x snmpd) -o rss= | awk { 
i 
+= 
$1 
} 
END 
{ 
print 
i 
} 

而且它不知道如何處理多餘的事情。 (注意:$1的值將是shell的當前$1(可能是一個空字符串,在這種情況下,對應於$1的參數將被省略。)


這種變體,隨着awk腳本$1前一個反斜槓,似乎在爲我工作(當我看了這實際上是運行一個程序 - snmpd沒有在機器上運行,我測試過,和崩潰的東西,因爲那):

sh -c 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += \$1 } END { print i }"' 

如果您認爲有任何危險,沒有snmpd過程,那麼你需要做的事情有點不太緊湊。這是我測試的命令;您可以將watch -n 0.2代替sh -c。但要注意,對於watch手冊頁也明確說:

注意command賦於「sh -c」這意味着你可能需要使用額外的報價,以獲得預期的效果。

這非常準確!

如果你願意堅持使用單引號,你可以嘗試:

watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\' 

'\''主題背後的想法是,第一單引號終止當前的單引號的字符串;反斜槓單引號添加實際單引號,最後一個單引號開始新的單引號字符串。最後的'\'也可以寫成'\''',但最後兩個單引號是多餘的,所以我把它們排除了。

+0

謝謝你的努力JL。我喜歡雙引號的解釋和建議,這是合理的。 * awk *但是不喜歡使用雙引號,儘管...我迷失在這一個上。 –

+0

我可以肯定的是,出錯的診斷是有針對性的。更換更難以確定。你說這是行不通的。但'$(pgrep ...)'的東西工作正常。 ['watch']的手冊頁(http://linux.about.com/library/cmd/blcmdl1_watch.htm)表示:_注意__命令_被賦予「sh -c」,這意味着您可能需要額外使用引用以獲得理想的效果._ –

+0

好的。沒有給* watch *命令,* awk *不喜歡使用雙引號。所以當傳遞給watch * awk *仍然產生錯誤。也就是說,你的單引號變體工作正常。非常感謝。 –