我想运行pgrep来查找某个进程的ID。它工作得很好,除非以较大的bash命令运行时,因为pgrep也将与其父shell / bash进程匹配,该进程的命令行中包括match表达式。

pgrep明智地从结果中排除了它自己的PID,但不太明智的是,似乎没有选择排除其父进程。

任何人都可以遇到这个问题,并且有一个很好的解决方法。

更新。

pgrep -lf java || true

工作正常,但是
bash -c "(pgrep -lf java || true)"
echo 'bash -c "(pgrep -lf java || true)"' | ssh <host>

还确定父bash进程。

我正在将pgrep用作更大系统的一部分,这就是为什么要特别疯狂的原因。

最佳答案

我使用python的os.system(command)遇到了这个问题,该代码在子shell中执行命令。
pgrep与自身不匹配,但与包含pgrep参数的父 shell 匹配。

我找到了解决方案:

pgrep -f the-arguments-here[^\[]
[^\[]正则表达式确保它与[不匹配(正则表达式本身的开头),因此排除了父 shell 。

例:
$ sh -c "pgrep -af the-arguments-here"

12345 actual-process with the-arguments-here
23456 sh -c pgrep -af the-arguments-here

vs:
$ sh -c "pgrep -af the-arguments-here[^\[]"

12345 actual-process with the-arguments-here

关于linux - 如何通过ssh进行pgrep,或将pgrep用作较大的bash命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29803901/

10-09 03:08