Intereting Posts
Задайте локальный статический IP-адрес в сетевом интерфейсе и сохраните его даже после перезапуска информация о ходе работы через pv для копирования каталога Проблема производительности Fedora 23 32-бит @ Dell D630 4GB / Nvidia Соединение ssh зависает при поиске домена SERVFAIL Присоединившись к пользователю AD, изменив на Автоматизация резервных копий выполняется из сценария bash в Linux правильным способом сбросить соединение Ethernet без перезагрузки Как слить два словаря счетчика частоты – unix cmd? Как изменить ESC и CAPS_LOCK на TTY Проблемы с Backtrack Использование awk для объединения двух файлов csv на три поля также создает новый файл csv Как отключить компиляторы hotcorners и привязку для щелчков кнопок на краях экрана, когда я играю Описатель файла когда-либо НЕ открыт? В какой момент появился / домашний каталог? size в find (версия 4.4.2) не понимает префикс kilo

Как спать до определенной даты и времени?

Я хочу написать оболочку, в которой дана дата (день-час-мин), например

10:00 AM Sun 2:30 PM Mon ... 

Он спит до этой точной даты и времени. Я думал, что один из способов сделать это, я могу получить текущую дату и рассчитать разницу? затем преобразовать это в секунды и спать на это время.

Однако я не слишком уверен, как вы могли это сделать с помощью сценариев оболочки?

 #!/bin/bash now=$(date '+%A %W %Y %X') date = 2:30 PM Mon difference = ?? sleep difference 

если пользователю разрешено использовать команду, это идеальное решение для этого:

 $ at 08:00 022116 at> myscript.sh at> <----------- ctrl-d here job 9 at 2016-02-21 08:00 

если вы получите сообщение типа «пользовательский бла не может работать», попросите syadmin добавить этого пользователя в файл at.allow или удалить из файла at.deny зависимости от того, как он используется в вашей среде.

Если, конечно, вы не пожелаете, чтобы этот спальный день был посреди вашего сценария. Даже тогда вы можете сократить свой сценарий на два, записывая переменные, которые вы хотите сохранить, в файл, и когда придет время, а вторая часть вашего скрипта выполняется, он может прочитать эти переменные из сохраненного файла.

 #!/bin/bash NOW=$(date +"%s") SOON=$(date +"%s" -d "3:00 PM Sun") INTERVAL=$(($SOON-$NOW)) sleep $INTERVAL 

date GNU позволяет указать формат вывода, а также дату для отображения. Поэтому я использую строку формата «% s», чтобы получить время в секундах с эпохи, и то же самое в произвольное время с помощью -d paramater. Получите разницу, и у вас есть интервал спать.

Проверка даты в прошлом оставлена ​​в качестве упражнения для читателя.

Хотя, вероятно, вы должны использовать это, как уже было предложено, я иногда нахожу следующее полезным при работе с проблемами времени. Я немного сократил его, но ссылка есть.

Секунд с эпохи

Значение, которое приближается к числу секунд, прошедших со времени Эпохи. Имя координированного универсального времени (указанное в терминах s econds, m inutes, h ours, d ays с 1 января года и календарном ухе минус 1900) связано с временем, представленным в виде секунд со времен Эпохи, согласно выражение ниже.

Если год <1970 или значение отрицательное, отношение не определено. Если год> = 1970, а значение неотрицательно, это значение связано с именем координированного универсального времени в соответствии с выражением языка C, где все переменные являются целыми типами:

 s + m*60 + h*3600 + d*86400 + (y-70)*31536000 + ((y-69)/4)*86400 - ((y-1)/100)*86400 + ((y+299)/400)*86400 

Примечание .

Последние три условия выражения добавляют в день для каждого года, следующего за високосным годом, начиная с первого високосного года со времен Эпохи. Первый термин добавляет день каждые 4 года, начиная с 1973 года, второй вычитает день назад каждые 100 лет, начиная с 2001 года, а третий добавляет день назад каждые 400 лет, начиная с 2001 года. Разделы в формуле являются целыми делениями ; то есть остаток отбрасывается, оставляя только целое частное.