55 lines
979 B
Bash
55 lines
979 B
Bash
#!/usr/bin/env bash
|
|
# wait-for-multiple.sh
|
|
|
|
set -e
|
|
|
|
# Список хостов передается через аргументы до --
|
|
# Команда после --
|
|
HOSTS=()
|
|
CMD=()
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--)
|
|
shift
|
|
CMD=("$@")
|
|
break
|
|
;;
|
|
*)
|
|
HOSTS+=("$1")
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ${#HOSTS[@]} -eq 0 ]]; then
|
|
echo "Usage: $0 host1:port1 host2:port2 ... -- command args"
|
|
exit 1
|
|
fi
|
|
|
|
# Функция для wait-for-it
|
|
wait_host() {
|
|
local hostport=$1
|
|
/usr/bin/wait-for-it.sh "$hostport" --timeout=30 --strict
|
|
}
|
|
|
|
# Запускаем все ожидания параллельно
|
|
PIDS=()
|
|
for h in "${HOSTS[@]}"; do
|
|
wait_host "$h" &
|
|
PIDS+=($!)
|
|
done
|
|
|
|
# Ждем всех
|
|
FAIL=0
|
|
for pid in "${PIDS[@]}"; do
|
|
wait $pid || FAIL=1
|
|
done
|
|
|
|
if [[ $FAIL -ne 0 ]]; then
|
|
echo "One or more hosts failed to become available"
|
|
exit 1
|
|
fi
|
|
|
|
# Запускаем команду после всех
|
|
exec "${CMD[@]}"
|