我正在编写一些Nagios插件并遇到了奇怪的问题。我不知道我是否遗漏了一些东西,但是在Ruby中执行的命令没有返回与shell相同的结果:
[root@myhost~]# pgrep -f ntpd | wc -l
1
[root@myhost~]# irb
irb(main):001:0> `pgrep -f ntpd | wc -l`
=> "2\n"
[root@myhost~]# ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
按预期输出:
irb(main):009:0> `pgrep -f ntpd`.chomp
=> "23198"
根据the backticks documentation,该方法应该将命令的STDOUT作为字符串返回。
有什么想法吗?我觉得有一些我误解的基本原则。
答案 0 :(得分:0)
正如文档所述,反引号returns the standard output of running cmd in a subshell.
所以你看到的额外数字(2
而不是1
)是Ruby执行此命令的结果。
由于pgrep -f pattern
将匹配完整命令,因此它还会计算执行pgrep
的irb的结果。如果您在没有-f
的情况下尝试,则会看到1
。
为了更好地了解幕后发生的事情,你可以用
搞乱pgrep -f -l ntpd | wc -l && sleep 20
您应该看到类似额外sh
的内容,对应于执行以下过程的irb:
sh -c pgrep -l -f ntpd && sleep 20