在 shell 脚本中假设我运行了这样的命令
for i in `ps -ax|grep "myproj"`
do
echo $i
done
在这里,grep 命令将作为一个单独的进程执行。那么我如何在 shell 脚本中获取它的 PID 呢?
当你在后台运行一个进程时,你可以得到它的 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。
我在这里四处走动,并且理解这看起来更像是评论。
为什么需要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,因为它根本不会显示为循环迭代。