0

我正在尝试通过 shell 脚本执行几个复杂的 grep 命令,这些脚本在终端中手动执行。我一生都无法弄清楚为什么这不起作用。第一个 grep 的目标是获取附加到父 myPattern 的任何进程 ID。第二个获取进程myPattern的进程id

目前,我的 shell 脚本第一次没有返回任何内容。忽略第二个中的“grep -v 'grep'”部分。

#!/bin/sh

ps -ef | grep "$(ps -ef | grep 'myPattern' | grep -v grep | awk '{print $2}')" | grep -v grep | grep -v myPattern | awk '{print $2}'
ps -ef | grep 'myPattern' | grep -v 'grep' | awk '{print $2}'

当手动在终端中运行时,这可以正常工作。我有什么想法吗?

4

1 回答 1

0

你的第一个命令是模糊的。我认为它不会可靠地按照您的描述进行。它也不能防止获取第一个 grep 调用的 id。第二个对我有用。对于拳头查询,它在很大程度上取决于您使用的系统。使用 pstree 在 pid 下显示整个进程树更容易。喜欢:

pstree -p 1782 | sed 's/-/\n/g' | sed -n -e 's/.*(\([0-9]\+\)).*/\1/p'

您需要将 pid 限制为单个值。如果你有更多的值,那么你必须遍历它们。如果您没有 pstree,那么您可以围绕 ps 制作一些循环。请注意,即使您当前的命令有效,thwy 也只会捕获一级父/子关系。pstree 执行任何级别。

我还必须告诉你,一个进程可以通过分叉将原始父进程作为父进程逃脱。

在任何情况下,如果没有确切的细节,您想要实现什么以及为什么,以及在什么平台上很难给您一个很好的答案。此外,这些实用程序虽然几乎无处不在,但并不像人们希望的那样便携。

还有一点需要注意 - /bin/sh 通常不是您当前的 shell。在许多 linux 系统上,用户有一个默认的 bash shell,而 /bin/sh 是 dash 或其他一些 shell 变体。因此,如果您在控制台和脚本中看到差异,那么您使用的实际 shell 可能会有所不同。

根据用户反馈,在 java 进程启动脚本中有这样的内容会容易得多:

java <your params here> &
echo $! > /var/run/myprog.pid

然后 kill 脚本看起来像echo /var/run/myprog.pid | xargs kill. 有更短的命令,但我认为这更便携。如果您想要更具体,请提供实际代码。

于 2013-02-26T09:02:58.960 回答