1

我自己不是软件/脚本编写人员,因此很难理解这里发生的事情:

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

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

我在这里遇到的麻烦是我可以运行以下罚款:

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

但是,我只需要数值,因此使用awk 去除所有内容,但该值很重要。

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

有什么建议么?

另外,我读过

pmap -x [pid]

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

问候。

4

1 回答 1

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-line, 1watch` 获得多个参数:

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

它不知道如何处理多余的东西。(注意: 的值$1将是 shell 的当前值$1(可能是一个空字符串,在这种情况下,对应的参数$1将被省略。)


这个变体,$1awk脚本中的之前有一个反斜杠,似乎对我有用(当我寻找一个实际正在运行的程序时——snmpd它没有在我测试的机器上运行,因此事情崩溃了):

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

If you think there's any danger that there is no snmpd process, then you need to do things a little less compactly. That's the command I tested; you can put the watch -n 0.2 in place of the sh -c. But note that the man page for watch does explicitly say:

Note that command is given to "sh -c" which means that you may need to use extra quoting to get the desired effect.

That was very accurate!

If you prefer to stick with single quotes, you could try:

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

The idea behind the '\'' motif is that the first single quote terminates the current single-quoted string; the backslash single quote adds an actual single quote, and the last single quote starts a new single-quoted string. The '\' at the end could also be written '\''', but the last two single quotes are redundant, so I left them out.

于 2013-03-30T00:28:00.817 回答