gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:25:25 25 4
gpt4 key购买 nike

我在这里阅读了几篇关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com