сценарий bash :исправлено время ожидания, которое суммируется в цикле while

Наконец-то я обнаружил проблему, :моя служба по какой-то причине добавляла список CapabilityBoundingSet, что ограничивало операции sudo.

13
10.05.2020, 08:20
2 ответа

Потому что SECONDS— внутренняя переменная в bash. Он хранит количество времени, в течение которого оболочка работала.

Изman bash:

SECONDS
Each time this parameter is referenced, the number of seconds since shell invocation is returned. If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned.

Итак, ваш скрипт работает так:

  1. При первом использовании он принимает значение 5 в качестве входных данных, начальное значение равно 5.
  2. Затем происходит 5-секундный сон, когда этот сон возвращается, значение SECONDS будет равно 5 секундам исходного значения + 5 секунд сна = 10 секундам
  3. Затем следует 10-секундный сон (Текущее значение SECONDS )плюс предыдущее накопленное время в 10 секунд дает 20.
  4. Повторить спящий режим в течение 20 секунд, плюс предыдущее значение 20 равно 40.
  5. и т. д.
26
28.04.2021, 23:15

Существует проблема второго -порядка с этой конструкцией :, если обработка в цикле занимает значительное время (, скажем, 1,4 секунды ), тогда цикл будет повторяться только каждые 6,4 секунды.

Если это важно, вы можете вместо этого считать петли.

#!/bin/bash

Expired=$(( SECONDS + 23 ))
Tick=5
Iter=1

while (( SECONDS < Expired )); do
    echo "$(date '+%T.%N'): Loop $Iter"
    sleep 1.4  #.. Simulate work.
    echo "$(date '+%T.%N'): Idle"
    sleep $(( Iter++ * Tick - SECONDS ))
done                    

Время цикла стабильно с точностью до СЕКУНД.

Вы можете выполнить более сложную арифметику для инициализации Expired (, например. используйте две команды даты, чтобы найти секунды до полуночи ).

5
28.04.2021, 23:15

Теги

Похожие вопросы