0

在 shell 脚本中假设我运行了这样的命令

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

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

4

2 回答 2

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已经退出,因此您再也找不到它的 PID。

于 2012-07-02T06:51:27.007 回答
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,因为它根本不会显示为循环迭代。

于 2012-07-02T06:54:35.243 回答