Подождите, пока несколько bash функций завершат или выйдут из них по таймауту - PullRequest
0 голосов
/ 01 мая 2020

In имеют функцию, которую я вызываю в al oop параллельно:

#!/bin/bash

my_func()
{
    until [[ $entity status is OK ]]; do
        sleep 5
        echo "count=$count"
        if (( timeout_flag == 1 )); then
            break
        fi
    done
}

_arr=(e1 e2 e3)
count=0
timeout=60
timeout_flag=0

for entity in "${_arr[@]}"; do
    my_func "${entity}" &
done

while [[ "${count}" -lt "${timeout}" ]]; do
    sleep 5
    count=count+5
done
timeout_flag=1
echo "Timeout reached"
sleep 1

Я хочу, чтобы все функции периодически проверяли, пока статус объекта не был в порядке, и ждали все состояния OK или не останавливались все (оставшиеся) функции по истечении времени ожидания? Что бы ни пришло первым. Вышеприведенное, похоже, не работает, и мне нужно убить его вручную.

  • Почему я получаю эхо-запрос "Timeout reached" в конце, и сценарий не ожидает завершения функций sh?

  • Почему count=0 в my_fun c и не увеличивается?

1 Ответ

2 голосов
/ 01 мая 2020

Если вы хотите тайм-аут каждой функции через 60 секунд, вы можете использовать команду timeout ; это сделано именно для этого:

#!/bin/bash                                                                                                                                                                                   

my_func() {
    to_sleep=$1
    stdbuf -oL echo "Request to sleep at least $to_sleep s"
    slept=0
    while [[ $slept -lt $to_sleep ]]; do
        sleep 1
        slept=$((slept + 1))
    done
    echo "Successfully slept $slept s ($to_sleep s requested)"
}

export -f my_func

_arr=(1 3 5)
maxtime=4s

for entity in "${_arr[@]}"; do
    stdbuf -oL echo "Launching with $entity s"
    timeout $maxtime bash -c "my_func $entity" &
done

Вывод

Launching with 1 s
Launching with 3 s
Launching with 5 s
Request to sleep at least 1 s
Request to sleep at least 3 s
Request to sleep at least 5 s
Successfully slept 1 s (1 s requested)
Successfully slept 3 s (3 s requested)

Обратите внимание, что дело "5 с" не удалось.

Примечания:

  • stdbuf -oL здесь для гриппа sh вывод эха напрямую
  • export -f my_func и timeout $maxtime bash -c добавлены, чтобы сделать вашу функцию видимой в новой оболочке, запущенной timeout , следуя этому ответу .
...