#!/bin/bash echo "Параллельное выполнение скриптов и создание репозиториев для каталогов проектов." # выполнение скриптов внутри каталога function orchestrate { echo "Обработка: $1" cd "$1" || return while (($(date '+%s%3N') - time_ms < 120000)); do while (($(date '+%s%3N') - time_ms < 120000)); do # 1 Удаление репозитория на сервере ./.repo_remote.sh "delete" 2>/dev/null >.repo_remote.log # 2 Создание репозитория на сервере ./.repo_remote.sh "create" 2>/dev/null >>.repo_remote.log # 3 Проверка корректности ответа от сервера при создании репозитория case "$(tail -n+10 .repo_remote.log | grep -cE '^HTTP/[1,2].{,2}? [4,5]')" in 0) break ;; *) echo "Ошибка 400-500 при подключении к серверу: $1" ;; esac done # 4 Создание локального репозитория и отправка данных на сервер ./.repo_local.sh 2>/dev/null >.repo_local.log # 5 Изменение настроек репозитория на сервере, отключение ненужного ./.repo_remote.sh "options" 2>/dev/null >>.repo_remote.log # 6 Проверка доступности данных в вёб-интерфейсе на сервере for ((tms = "$(date '+%s%3N')"; $(date '+%s%3N') - tms < 3000; )); do case "$(./.repo_testing.sh | grep -cF '[91m')" in 0) pass=true && break 2 ;; *) echo "Ожидание данных на сервере: $1" ;; esac done done [ "$pass" != true ] && echo "Ожидание более 2 минут: $1" } export -f orchestrate cd ../.. # выход из папки и из репозитория export time_ms && time_ms="$(date '+%s%3N')" # запуск параллельной обработки всех каталогов проектов, расположенных на одном уровне с текущим find . -mindepth 1 -maxdepth 1 -type d -printf 'orchestrate "%p"\0' | xargs -n1 -0 -P0 bash -c # замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))" ms="$((tms % 1000))" && printf 'Общее время выполнения: %02d:%02d.%03d мс.\n' "$min" "$sec" "$ms"