Наконец-то я обнаружил проблему, :моя служба по какой-то причине добавляла список CapabilityBoundingSet
, что ограничивало операции sudo
.
Потому что 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,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 (, например. используйте две команды даты, чтобы найти секунды до полуночи ).