
Есть ли (полу)стандартная команда Unix, которая будет спать до времени, указанного в ее командной строке? Другими словами, я ищу что-то похожее, sleep
что будет использовать время пробуждения, а не длительность.
Например:sleeptill 05:00:00
Я могу что-то закодировать, но предпочитаю не изобретать велосипед, если что-то уже есть.
Бонусный вопрос: было бы здорово, если бы можно было учитывать часовой пояс (например, sleeptill 05:00:00 America/New_York
).
редактироватьВвиду специфики моей деятельности я ищу решение «спать до Т», а не «выполнить команду в Т».
редактироватьВо избежание сомнений, если я запущу команду в 18:00 и скажу проснуться в 17:00, я ожидаю, что она будет спать 23 часа (или, в некоторых особых случаях, связанных с летним временем, 22 или 24 часа).
решение1
Если вы работаете в Unix, где есть хорошая команда date, и используете bash, вы можете использовать этот %s
формат для вычисления времени.
sleep $(( $(date -j 1700 +%s) - $(date +%s) ))
1700
сейчас 5 вечера.-j
указание даты не означает, что нужно устанавливать дату.
решение2
А как насчет этого (объединения идей w00t и Gille в одну функцию)?
function sleep_until {
seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
echo "Sleeping for $seconds seconds"
sleep $seconds
}
Использование:
sleep_until 8:24
Sleeping for 35 seconds
sleep_until '23:00'
Sleeping for 52489 seconds
sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds
решение3
Проверьте Linux/Unixat
команда. Используя пример 5 утра:
at 05:00 some_command
Он также поддерживает часовые пояса:
Имя часового пояса GMT, UCT или ZULU (без учета регистра) может следовать за указанием времени по всемирному координированному времени. Другие часовые пояса могут быть указаны с помощью переменной среды TZ.