2017-01-23 29 views
0

我已经在这里阅读了几篇关于pgrep'似乎'返回自己的帖子,即使它永远不应该。关键似乎是bash和sh功能之间的区别。除了我的情况,我已经证实sh真的是一个bash的链接。关于pgrep返回自己的确认

  • 我在SuSE 12 x86_64的运行
  • /bin/sh的是来砸
  • /斌/ bash的一个链接是真正的二进制

我有叫Ruby脚本pgrep命令是这样的:

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

我需要,因为我实际使用的参数来唯一标识一个特定的Java“过程中要使用完整的命令行。

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

要回顾一下:

p纤ep永远不会返回本身。但是sh和bash的区别可能会导致它显示一个子shell。但是我证实了sh是一个bash的链接,所以在行为上应该没有区别。

我怀疑(并且正在寻求确认)是因为Ruby反引号而创建了一个额外的子命令,而这正是由pgrep命令拾取的(仅有时间计时问题?)。

这一直是一个真正的痛苦,我想确保我实施的修复将真正使问题消失。鉴于我与,我要么会

  1. 工作追加| grep -v grep我指挥的最后
  2. 扔掉含有“grep”可以同时通过红宝石内返回的结果循环任何结果的代码脚本

我想,#2是速度更快,但它仍然惹恼我,我一定要过滤掉p纤ep本身。

我在正确的轨道上吗?或者您认为其他方面正在发挥作用吗?

谢谢你的时间!

+1

当''因为它sh'表现为POSIX'sh',不'bash' bash'被调用。 –

+0

啊,那将是失踪的拼图!谢谢! –

回答

0

答案已经在我的问题的评论中,但我想我会用正式答案关闭它。

该件的我缺少信息是

当bash被调用作为SH它表现为一个POSIX SH,不是bash。 - JörgW Mittag 1月23日23:31

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

0

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

pgrep -f target | grep -v $$