2012-07-02 95 views
0

在外壳脚本可以说,我已经运行这样壳牌脚本获取命令PID

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

这里的命令,grep命令将作为一个单独的处理被执行。那么我如何在shell脚本中获得它的PID?

+0

如果你找到它,你将如何处理它的PID?当它可用时,命令已经完成,所以PID不再有效。 –

+0

假设我在循环中获得它与某个值进行比较? – Cygnus

回答

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,因为它根本不会显示为一个循环迭代。

+0

OK .. -v开关与grep有什么关系? – Cygnus

+0

谢谢!这解决了问题:) – Cygnus

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了。

+0

谢谢!我必须在后台运行它才能获得它的PID。 :) – Cygnus

+0

当然你可以做到,但也可能有其他方法来解决你的任务。在后台运行grep并找到它的PID,好吧......这有点奇怪:) –