2013-03-30 65 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 *仍然产生错误。也就是说,你的单引号变体工作正常。非常感谢。 –