7

Возьмите следующий сценарий оболочки, например:

#!/bin/bash
python do_this_first.py 
python do_this_second.py
python do_this_last.py

Буду ли я запускать вышеописанное 3 сценария Python параллельно? Поскольку я хочу, чтобы do_this_second запускался только после завершения do_this_first.

3 ответа3

23

В нынешнем виде они будут запускаться один за другим, независимо от того, провалились они или нет. Они должны выйти только в какой-то момент, затем запускается следующая команда. Один за другим.

Если вы хотите, чтобы они выполнялись, только если предыдущие команды не завершились с ошибкой, используйте:

python do_this_first.py && python do_this_second.py && python do_this_last.py

Здесь два амперсанды работают как логические. Второй сценарий будет запускаться только тогда, когда первый вышел корректно, а третий - только тогда, когда второй запущен без ошибок. Если произошла какая-либо ошибка, ни одна из следующих команд не запустится.


Однако если вы хотите запустить их параллельно, вы можете сделать это, но есть много других вариантов:

python do_this_first.py &
python do_this_second.py &
python do_this_last.py &
2

Как сказал slhck , ниже приведен один вариант.

python do_this_first.py && python do_this_second.py && python do_this_last.py

Или вы можете установить -e, который немедленно завершится, если строка вернет код ошибки.

#!/bin/bash

# Exit immediately if a command exits with a non-zero status.
set -e

python do_this_first.py 
python do_this_second.py
python do_this_last.py

Для меня этот последний более читабелен.

2

Bash является последовательным. В начале файл do_this_first.py будет интерпретирован. После того, как python завершит его выполнение, управление снова будет переведено в bash. Bash, в свою очередь, выполнит python do_this_second.py и так далее.
По сути, do_this_first начинается и заканчивается, do_this_second запускается и заканчивается, а затем do_this_last запускается и заканчивается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .