我在 Bash 终端中运行此命令
while [ 0 ]; do
i=1;
echo $i;
done
在运行这个循环之前,在 gnome-terminal 的另一个选项卡中我做了
$ps aux | wc -l
192
当循环仍在运行时,我再次执行了
$ps aux | wc -l
192
我的问题 -
为什么 while 循环似乎没有获得 PID?
如何获取 while 循环内运行的各个命令的 PID?
答案1
while
没有获得自己的 PID,因为它是 shell 关键字,而不是外部命令。您将获得列为进程的 PIDbash
。要获取 PID,请插入echo $$
内部while
循环并使用ps aux | grep '[b]ash'
来匹配 PID。如果任何命令不是 shell 内置命令,您可以使用通常的方式获取 PID,例如使用
ps
,pgrep
。在 PPID(父进程 ID)字段中,您通常会看到它正在运行的 shell PID。例如。要获取有关
foobar
shell 循环内命令的详细信息,您可以执行以下操作:ps -ef | grep '[f]oobar'
或者
ps aux | grep '[f]oobar'
或者
pgrep
:pgrep 'foobar'
由于将运行多个 shell 进程,因此您应该考虑详细信息并检查 PPID 字段以匹配 shell PID。
请注意,当您循环时,进程表中任何进程的可用性将取决于它运行的时间以及您检查进程表的时间。
答案2
while
和echo
是内置的 bash shell 命令 - 它们没有单独的 PID。尝试将该命令添加sleep 1
到命令列表中。然后,您将在 中看到一个新命令ps
。