У меня есть скрипт bash с функцией, которая должна работать параллельно с разными аргументами.
Мне нужно знать, если хотя бы одно из выполнений завершилось неудачно (вернул ненулевое значение) - не имеет значения, сколько из них вышло из строя.
Команда принимает массив параметров для выполнения.
Мне нужно ограничить одновременность до 4 одновременных запусков из-за высокой нагрузки.
Мне также нужно распечатать журналы в родительском процессе (тот, который запускает скрипт bash)
это функция, которую я запускаю:
function run_and_retry {
EXIT_STATUS=0
$COMMAND || EXIT_STATUS=$?
if [ $EXIT_STATUS -ne 0 ]; then
EXIT_STATUS=0
$COMMAND || EXIT_STATUS=$?
fi
return $EXIT_STATUS
}
Я пытался использовать GNU параллельно и xargs и столкнулся с проблемами в обоих.
С xargs: (не удалось получить статус выхода из него, и он также не работал, когда я запустил его в TravisCI)
PARAMETERS=(first-parameter second-parameter third-parameter)
export -f run_and_retry
echo "${PARAMETERS[@]}" | xargs -P 4 -n 1 -I {} bash -c "run_and_retry {}"
С параллельным GNU:
PARAMETERS=(first-parameter second-parameter third-parameter)
export -f run_and_retry
parallel -j 4 -k --lb 2 run_and_retry {} ::: echo "${PARAMETERS[@]}"