shell 如何执行此代码 'cd $dir && php -f test_loop.php &'

How shell executes this code 'cd $dir && php -f test_loop.php &'

我想知道 shell 如何在 .sh 文件中执行此代码(如 test.sh):

while true
do
    # check php process. If not running, run it. 
    cd $some_dir && php -f some_file.php &
    # sleep 1s
done

一些输出:

ps -ef|grep test|grep -v grep
root     10963  3040  0 11:13 pts/19   00:00:00 /bin/bash ./test.sh start
root     10973 10963  0 11:13 pts/19   00:00:00 /bin/bash ./test.sh start
root     10975 10973  0 11:13 pts/19   00:00:00 php -f test_loop.php

在我的例子中,有3个进程,包括2个test.sh和1个php。 但是如果使用下面的代码,也就是在两行或者括号里面,就可以了:

cd $some_dir && (php -f some_file.php &)

cd $some_dir
php -f some_file.php &

输出:

ps -ef|grep test|grep -v grep
root     11112  3040  0 11:14 pts/19   00:00:00 /bin/bash ./test.sh start
root     11122 11112  0 11:14 pts/19   00:00:00 php -f test_loop.php

这样的话,在一个subshell中执行了两种代码,这是我们所期望的。

第一种情况,好像是在原进程和php进程之间有一个中间进程。那么它是什么以及为什么创建它?

声明

cd $some_dir && php -f some_file.php &

运行s 在 subshell 中,这就是您看到额外进程的原因。在您的输出中,PID 10963 是原始 (parent) shell,10973 是子 shell,其 child 是 PHP 进程。由于无限循环,grandparent (PID 10963) 处于活动状态。

当您删除 && 时,parent shell 本身中的两个语句 运行 因此您看不到额外的过程。