我想运行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作为一个更大的系统的一部分,这就是为什么额外的疯狂。
答案 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中更改或编写脚本。