ruby - 关于 pgrep 返回自身的确认

标签 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 "p​​grep -f blah"

回顾一下:

pgrep 永远不会返回自己。但是 sh 与 bash 的差异可能会导致它显示一个子 shell。但我验证了 sh 是 bash 的链接,所以行为应该没有区别。

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

这真的很痛苦,我想确保我实现的修复能够真正解决问题。鉴于我正在使用的代码,我要么去

  1. 附加一个| grep -v grep 到我命令的结尾
  2. 在 Ruby 脚本中循环返回的结果时丢弃任何包含“grep”的结果

我认为 #2 更快,但仍然让我恼火的是我必须过滤掉 pgrep 本身。

我走的路对吗?还是您认为有其他因素在起作用?

感谢您的宝贵时间!

最佳答案

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

pgrep -f target | grep -v $$

关于ruby - 关于 pgrep 返回自身的确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816962/

相关文章:

linux - 无法重新连接到 NX session ,错误为 : "error in locking authority file"

node.js - 如何将命令传递到 screen session ?

linux - GPerfTools/pprof : what does a dashed line mean?

linux - 命令脚本将文件识别为目录

ruby - #<Hash :0x3d3cef0> (NoMethodError) in ActiveSupport 3 的未定义方法 `to_json'

ruby-on-rails - Bundler 找不到 gem "multi_json"的兼容版本

ruby - 为什么是 Module.methods() 和 respond_to?在 irb 中的工作方式与在脚本中不同?

ruby-on-rails - 在 Rails 中本地化嵌套的虚拟属性

linux - 这个 Bash 命令中的 `! -d` 是什么意思?

java - 在简单的 Scala 应用程序中嵌入终端窗口