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 本身中的两个语句 运行 因此您看不到额外的过程。
我想知道 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 本身中的两个语句 运行 因此您看不到额外的过程。