Memory management 这个命令有什么问题?

Memory management 这个命令有什么问题?,memory-management,process,awk,watch,pmap,Memory Management,Process,Awk,Watch,Pmap,我自己也不是一个软件/脚本编写者,所以很难理解这里发生了什么: watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }'' 基本上,我希望每秒打印5次snmp守护进程的常驻设置大小值(以获得公平的分辨率)。然后,我打算在此基础上构建,将输出重定向到文本文件,以便稍后进行分析,例如,我可以将数据放入图形中 我在这里遇到的问题是,我可以运行以下罚款: watch -n 0.2 'p

我自己也不是一个软件/脚本编写者,所以很难理解这里发生了什么:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }''
基本上,我希望每秒打印5次snmp守护进程的常驻设置大小值(以获得公平的分辨率)。然后,我打算在此基础上构建,将输出重定向到文本文件,以便稍后进行分析,例如,我可以将数据放入图形中

我在这里遇到的问题是,我可以运行以下罚款:

watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss'
但是,我只需要数值,所以使用awk去除所有内容,但该值很重要

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

有什么建议吗

我也读过

pmap -x [pid]
同样有效,但是当我使用snmpd各自的PID运行它时,输出为零,而显然不是。对此也有什么想法吗


关于。

如果引用的命令准确:

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
对应的参数将被忽略。)


这个变体在
awk
脚本中的
$1
前面加了一个反斜杠,似乎对我很有用(当我寻找一个实际运行的程序时-
snmpd
没有在我测试的机器上运行,因此出现了问题):

如果您认为没有
snmpd
进程存在任何危险,那么您需要简化一些。这是我测试的命令;您可以将
watch-n0.2
替换为
sh-c
。但是请注意,的手册页确实明确指出:

请注意,
命令
被赋予“
sh-c
”,这意味着您可能需要使用额外的引用来获得所需的效果

那是非常准确的

如果您喜欢使用单引号,可以尝试:

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

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

如果引用的命令正确:

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 -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
对应的参数将被忽略。)


这个变体在
awk
脚本中的
$1
前面加了一个反斜杠,似乎对我很有用(当我寻找一个实际运行的程序时-
snmpd
没有在我测试的机器上运行,因此出现了问题):

如果您认为没有
snmpd
进程存在任何危险,那么您需要简化一些。这是我测试的命令;您可以将
watch-n0.2
替换为
sh-c
。但是请注意,的手册页确实明确指出:

请注意,
命令
被赋予“
sh-c
”,这意味着您可能需要使用额外的引用来获得所需的效果

那是非常准确的

如果您喜欢使用单引号,可以尝试:

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

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

谢谢你的努力JL。我喜欢双引号的解释和建议,这很有意义。但是awk不喜欢使用双引号…我在这一点上迷失了方向。我可以相当肯定的是,错误的诊断是正确的。更换更难确定。你我们说它不起作用。但是
$(pgrep…
的东西起作用了。的手册页上说:注意,命令是给“sh-c”的,这意味着你可能需要使用额外的引用来获得想要的效果。好的。如果不给命令观看,awk不喜欢使用双引号