【问题标题】:pgrep returning true in makefile but not in shellpgrep 在makefile中返回true,但在shell中不返回
【发布时间】:2018-03-01 00:48:31
【问题描述】:

为什么当我在 Makefile 中使用 pgrep 时,它会找到一个进程 ID,但在 shell 中运行时却找不到?例如,假设我有这个 makefile

SHELL = /bin/bash

tst:
    if pgrep -f askdfkasdfj ; then     \
      kill $$(pgrep -f askdfkasdfj);   \
    fi

当我运行make tst 时,它会找到一个进程并进入if 主体,即使没有名为“askdfkasdfj”的进程。我试图用pgrep 替换在这种情况下工作正常的ps aux | grep ... 并遇到了这个问题。

【问题讨论】:

  • 仅供参考,如果你有pgrep,你可能也有pkill
  • 是的,好点 :)
  • 你在做类似make askdfkasdfj的事情吗?然后pgrep 会找到make 命令。
  • 不,我只是在运行make tst。在 make 退出后,放在 stdout 上的进程 ID 似乎也不存在
  • @Barmar 你所说的让我觉得 make 启动了一个进程,其中包含整个命令作为其名称的一部分?

标签: bash makefile process grep


【解决方案1】:

我认为它正在查找来自 makefile 本身的命令。 make 正在执行类似的操作:

/bin/bash -c 'if pgrep -f askdfkasdfj ; then kill $$(pgrep -f askdfkasdfj); fi'

这在-c 参数中包含askdfkasdfj,因此匹配。

但我不确定为什么当您使用 ps aux | grep 时没有发生这种情况。

【讨论】:

  • 如果你使用pgrep -l -f ...,你会看到什么。然后你应该看到整个命令行。
  • 我使用的是pgrep -a。你的意思是在if 子句中使用它吗?我不确定这是否可以解释它,因为即使名称作为正则表达式复杂,它仍然返回 true
  • 是的,在if 子句中。你看到了什么?
  • 是的,你是对的。使用正则表达式确实有效。我已经注释掉了 kill 行,但即使是注释行也会被放入进程的名称中!
猜你喜欢
  • 2015-02-27
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多