在shell脚本中,我可以说我已经运行了这样的命令
for i in `ps -ax|grep "myproj"`
do
echo $i
done
这里,grep命令将作为单独的进程执行。那我如何在shell脚本中获取它的PID?
答案 0 :(得分:1)
在后台运行流程时,可以在$!
$ ps aux | grep dddddd & echo $!
[1] 27948
27948
ic 27948 0.0 0.0 3932 760 pts/3 R 08:49 0:00 grep dddddd
当处于前景时 - 在您想要找到其PID的点处,该过程不再存在。当你在循环中时,for语句已经执行并且grep
已经退出,所以你再也找不到它了。
答案 1 :(得分:1)
我在这里走出困境,明白这看起来更像是评论。
为什么需要grep
命令的PID?
在你的评论中,你说你想在循环中将它与某些东西进行比较。我认为你的问题是循环(有时)不仅包括myproj
而且还有关于grep命令的项目?如果是这样,请尝试以下操作:
for i in `ps -ax | grep -v grep | grep "myproj"`
do
echo $i
done
-v
开关基本上反转了模式,因此grep -v grep
(或grep -v "grep"
,可能看起来不那么尴尬)将仅包含不包含字符串“grep”的行(见man grep)。
请注意,对于某些情况,这可能过于模糊,例如,如果您实际查找的模式也包含字符串“grep”。例如,以下内容可能无法正常运行:ps -ax | grep -v grep | grep mygrepling
但是,在您的特定情况下,您只会查找“myproj”。
或者你可以简单地使用
for i in `ps -ax | grep "my[p]roj"`
do
echo $i
done
这样就不需要知道grep命令的PID了,因为它根本就不会显示为循环迭代。