关于pgrep返回的确认

时间:2017-01-23 22:40:01

标签: ruby linux bash shell grep

我在这里看了几篇关于pgrep'似乎'尽管它永远不应该返回自己。关键似乎是bash和sh函数之间的区别。除了在我的情况下,我已经确认sh确实是bash的链接。

  • 我在SuSE 12 x86_64上运行
  • / bin / sh是bash的链接
  • / bin / bash是真正的二进制文件

我有一个调用pgrep的Ruby脚本:

  cmd="/usr/bin/pgrep -lf \"#{target}\""
  pidList=`#{cmd}`

我需要使用完整的命令行,因为我实际上使用了一个参数来唯一地标识特定的' java'处理。

现在,由于一些不相关的愚蠢行为,我几乎立即对返回的每个pid做了ps -p。有一段时间,这让我非常悲痛,因为ps有时候什么都不会回来。最终我能够捕获到pid上的ps返回pgrep命令的情况。但它是pgrep命令本身,而不是sh -c "pgrep -f blah"

回顾一下:

pgrep永远不会回归自己。但是sh vs bash的差异会导致它显示子shell。但我确认sh是bash的链接,所以行为应该没有区别。

我怀疑(并且正在寻找确认)是因为Ruby反引号正在创建一个额外的子命令,那就是pgrep命令拾取的内容(有时只是时间问题?)。 / p>

这是一个真正的痛苦,我想确保我实施的修复将真正解决问题。鉴于我正在使用的代码,我要么去

  1. | grep -v grep附加到我的命令的末尾
  2. 抛弃任何包含' grep'的结果循环遍历Ruby脚本中的返回结果
  3. 我觉得#2速度更快,但我仍然不得不过滤掉pgrep本身。

    我是在正确的轨道上还是你认为其他的东西在起作用?

    谢谢你的时间!

2 个答案:

答案 0 :(得分:0)

答案已经在我的问题的评论中,但我想我会以正式答案结束这个。

我缺少的信息是

  

当bash被调用为sh时,它表现为POSIX sh,而不是bash。 - JörgWMittag 1月23日23:31

所以是的,pgrep表现正常。但是当你通过反引号从Ruby脚本调用它时,你仍然需要过滤掉'pgrep'

答案 1 :(得分:0)

问题不在于shell风格:调用pgrep的shell进程也在进程中显示(并且在其完整命令中有搜索到的字符串),所以我们需要像这样过滤掉它:

pgrep -f target | grep -v $$