如何在ssh上pgrep,或者使用pgrep作为更大的bash命令?

时间:2015-04-22 16:42:01

标签: linux bash ssh grep

我想运行pgrep来查找某个进程的ID。它工作得很好,除非作为一个更大的bash命令运行,因为pgrep也会匹配它的父shell / bash进程,其中包含匹配表达式作为命令行的一部分。

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

任何人都会遇到这种情况并有一个很好的解决方法。

更新。

pgrep -lf java || true

工作正常,但

bash -c "(pgrep -lf java || true)"
echo 'bash -c "(pgrep -lf java || true)"' | ssh <host>  

还标识父bash进程。

我正在使用pgrep作为一个更大的系统的一部分,这就是为什么额外的疯狂。

2 个答案:

答案 0 :(得分:2)

我使用python&#39; s 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

答案 1 :(得分:1)

我仍然没有看到为什么你需要bash -c看到的部分。你应该可以做到

ssh <host> pgrep -lf java || true

实际上会在本地计算机上运行true,但您可以

sssh <host> "pgrep -lf java || true"

如果你需要真的在偏远的一面。再次,假设您的shell接受该语法(即,是bash)

你已经在bash shell中运行了ssh另一端的所有内容,所以我认为你不需要再次显式调用bash - 除非你的默认shell是别的,那么你可以想要考虑在适当的默认shell中更改或编写脚本。