我在这里阅读了几篇关于 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 与 bash 的差异可能会导致它显示一个子 shell。但我验证了 sh 是 bash 的链接,所以行为应该没有区别。
我怀疑(并且正在寻找确认)是由于 Ruby 反引号而创建了一个额外的子命令,这就是 pgrep 命令拾取的(只是有时......计时问题?)。
这真的很痛苦,我想确保我实现的修复能够真正解决问题。鉴于我正在使用的代码,我要么去
- 附加一个
| grep -v grep
到我命令的结尾 - 在 Ruby 脚本中循环返回的结果时丢弃任何包含“grep”的结果
我认为 #2 更快,但仍然让我恼火的是我必须过滤掉 pgrep 本身。
我走的路对吗?还是您认为有其他因素在起作用?
感谢您的宝贵时间!
最佳答案
问题不在于 shell 风格:调用 pgrep
的 shell 进程也在进程中显示(并且在其完整命令中包含搜索到的字符串),因此我们需要像这样过滤掉它:
pgrep -f target | grep -v $$
关于ruby - 关于 pgrep 返回自身的确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816962/