Как оболочка выполняет этот код 'cd $ dir && php -f test_loop.php &' - PullRequest
0 голосов
/ 25 октября 2018

Интересно, как 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

В моем случае есть три процесса, в том числе 2 test.sh и 1 php.Но если использовать следующий код, то есть в две строки или круглые скобки, это нормально:

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

или

cd $some_dir
php -f some_file.php &

output:

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

Inв этом случае два вида кодов выполняются в подоболочке, что мы и ожидаем.

В первом случае кажется, что между исходным процессом и процессом php существует промежуточный процесс.Так что же это и почему оно создано?

1 Ответ

0 голосов
/ 25 октября 2018

Оператор

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

выполняется в подоболочке, и именно поэтому вы видите дополнительный процесс.В вашем выводе PID 10963 является исходной (родительской) оболочкой, а 10973 - подоболочкой, чьим дочерним элементом является процесс PHP.Дедушка (PID 10963) активен из-за бесконечного цикла.

Когда вы удаляете &&, два оператора запускаются в самой родительской оболочке и, следовательно, вы не видите дополнительного процесса.

...