我试图通过shell脚本执行一些复杂的grep命令,这些脚本在终端中手动执行fin。我不能为我的生活弄清楚为什么这不起作用。 第一个grep的目标是获取附加到父myPattern的任何进程ID。第二个获取进程myPattern的进程ID
目前是我的shell脚本 第1次没有返回任何内容。 忽略了第二部分中的“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}'
手动在终端中运行时,此功能正常。我填这个想法的任何想法?
答案 0 :(得分: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是破折号或其他一些shell变种。因此,如果你看到你在控制台和脚本中拥有的差异,那么你使用的实际shell可能会有所不同。
根据用户反馈,在java进程启动脚本中使用这样的东西要容易得多:
java <your params here> &
echo $! > /var/run/myprog.pid
然后kill脚本看起来像echo /var/run/myprog.pid | xargs kill
。有较短的命令但我认为这更便携。如果您想要更具体的话,请提供实际代码。