Выполнить команду и распараллелить другие команды после завершения

Я ищу одну встроенную команду для выполнения /bin/first а затем, когда он завершает, выполните следующее /bin/p1, /bin/p2, /bin/p3 параллельно после.

2 ответа

Решение

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

#!/bin/bash 
/bin/first
/bin/p1 &
/bin/p2 &
/bin/p3 

Примечание: после завершения сценария p1 и p2 могут по-прежнему работать в фоновом режиме!

Чтобы облегчить, что ваш сценарий становится немного более сложным, так как вам нужно захватить PID и wait для них:

#!/bin/bash 
/bin/first
/bin/p1 &
PID1=$!
/bin/p2 & 
PID2=$!
/bin/p3 & 
PID3=$!  
for PIDS in $PID1 $PID2 $PID3 ;
do
  wait $PIDS
done

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

Если вам нужно убедиться, что вывод не смешивается:

/bin/first
parallel ::: /bin/p1 /bin/p2 /bin/p3
Другие вопросы по тегам