Мне нужна серия команд или одна команда, которая спит, пока не произойдет следующее вхождение определенного времени, например «4:00».
Как бы я это сделал?
Команда at
или cronjob не вариант, потому что я не должен оставлять сценарий, в котором я сейчас нахожусь.
Конкретный случай, о котором я говорю, - это скрипт, работающий на экране. Очень важно, чтобы я не останавливал выполнение сценария самим сценарием, поскольку в нем хранится много важных переменных, которые необходимы в какой-то момент сценария. Сценарий не всегда должен выполняться в обычном режиме. Это просто нужно выполнить в определенное время.
Было бы очень полезно, если бы сценарию пришлось создавать какие-либо файлы или любые другие задачи, такие как cronjobs или другие экраны. Это просто вопрос дизайна.
У меня просто была отличная идея:
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
У вас есть идеи получше?
Дополнительная информация будет добавлена по запросу!
date -d
наdate -j
и заменить4:00
на0400
.Ответы:
Предложение Тердона сработало бы, но, думаю, мое более эффективно.
Это вычисление разницы между данным временем и текущим временем в секундах. Если число отрицательное, мы должны добавить секунды за целый день (если быть точным, 86400), чтобы получить секунды, которые мы должны спать, и если число положительное, мы можем просто использовать его.
источник
Предполагая, что это сценарий оболочки, это должно работать:
Это в течение 24 часов. Если вы хотите, чтобы это продолжалось в 4:00 AM и 4:00 PM, используйте вместо этого:
источник
В OpenBSD следующее можно использовать для объединения
*/5
5-минутнойcrontab(5)
работы в00
почасовую (чтобы обеспечить генерацию меньшего количества электронных писем при выполнении одной и той же задачи с точными интервалами):Обратите внимание, что
date(1)
это также нарушило быsleep(1)
дизайн на последней итерации, поскольку60
минуты не являются допустимым временем (если это не так!), Поэтому нам не придется ждать дополнительного времени до получения нашего отчета по электронной почте.Также обратите внимание, что если одна из итераций займет более 5 минут, она также
sleep
будет любезно завершена с ошибкой, вообще не спя (из-за того, что отрицательное число интерпретируется как параметр командной строки, вместо того, чтобы переходить к следующий час или даже вечность), таким образом, убедившись, что ваша работа все еще может быть завершена в течение выделенного часа (например, если только одна из итераций занимает чуть более 5 минут, то у нас все еще будет время, чтобы наверстать упущенное, без что-нибудь на следующий час).printf(1)
Необходимо , потому чтоdate
предпологает ровно две цифры для минут спецификации.источник