Shell脚本获取命令PID

时间:2012-07-02 06:45:27

标签: shell pid

在shell脚本中,我可以说我已经运行了这样的命令

for i in `ps -ax|grep "myproj"`
do
  echo $i
done

这里,grep命令将作为单独的进程执行。那我如何在shell脚本中获取它的PID?

2 个答案:

答案 0 :(得分:1)

在后台运行流程时,可以在$!

中获取其PID
 $ 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了,因为它根本就不会显示为循环迭代。