这个命令有什么问题?

时间:2013-03-30 00:08:55

标签: memory-management process awk watch pmap

我自己不是一个软件/脚本人,所以很难理解这里发生的事情:

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

基本上我想打印我的snmp守护进程的Resident Set Size值每秒5次(公平分辨率)。然后,我打算从此构建,将输出重定向到文本文件,以便以后分析,例如,我可以将数据放入图形中。

我遇到的麻烦是我可以执行以下操作:

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

但是我只需要数字值,所以使用 awk 删除所有内容,但该值很重要。

运行上面的第一个命令会返回一个错误,我怀疑由于 watch 处理单引号的方式,但我不够聪明,无法理解它....

有什么建议吗?

另外,我已经读过那个

pmap -x [pid]

也可以,但是当我使用 snmpd 各自的PID运行它时,输出为零时显然不是。对此也有任何想法吗?

问候。

1 个答案:

答案 0 :(得分: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'之间的字符是逗号,而不是空格,shell继续给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对应的参数将被省略。)


这个变体在$1脚本中的awk之前带有反斜杠,似乎对我有效(当我查找实际运行的程序时 - 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 }'\'

'\''主题背后的想法是第一个单引号终止当前的单引号字符串;反斜杠单引号添加实际单引号,最后一个单引号启动一个新的单引号字符串。最后的'\'也可以写成'\''',但最后两个单引号是多余的,所以我把它们排除了。