我自己不是一个软件/脚本人,所以很难理解这里发生的事情:
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运行它时,输出为零时显然不是。对此也有任何想法吗?
问候。
答案 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 }'\'
'\''
主题背后的想法是第一个单引号终止当前的单引号字符串;反斜杠单引号添加实际单引号,最后一个单引号启动一个新的单引号字符串。最后的'\'
也可以写成'\'''
,但最后两个单引号是多余的,所以我把它们排除了。