Сон до наступного настання конкретного часу


11

Мені потрібна серія команд або одна команда, яка спить до наступного появи конкретного часу, наприклад "4:00".

Як би я це зробив?

atКоманда або cronjob не варіант , тому що я не повинен залишати сценарій , я перебуваю в даний момент.

Конкретний випадок, про який я говорю, - це сценарій, що працює на екрані. Дуже важливо, щоб я не зупиняв виконання сценарію самим сценарієм, оскільки в ньому зберігається багато важливих змінних, які потрібні в якийсь момент сценарію. Сценарій не завжди повинен виконуватись у звичайній справі. Це просто потрібно виконати в певний час.

Було б дуже доброякісно, ​​якби сценарій мав би створювати будь-які файли чи будь-які інші завдання, такі як кронштейни чи інші екрани. Це просто питання дизайну.

У мене просто була дивовижна ідея:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Чи є якісь кращі ідеї?

Більше інформації буде додано за запитом!


Скажіть, будь ласка, трохи уточнити своє запитання? Що ти маєш на увазі, коли ти кажеш: "Я не повинен залишати сценарій, в якому я зараз"
sebelk

Як щодо цього у вас є перевірка сценарію на наявність файлу "прокидання" і спати протягом періоду часу, перш ніж перевірити ще раз? Тоді ви можете використовувати cron для створення файлу, використовуючи надійність cron, але ви також можете мати свій довговічний сценарій. Попросіть сценарій видалити файл "прокинутися", коли він перестане спати.
kurtm

Зверніть увагу , що на Mac , ви повинні замінити date -dз date -jі замінити 4:00з 0400.
pjvandehaar

Відповіді:


17

Пропозиція Тердона спрацює, але, мабуть, моя ефективніша.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

Це обчислення різниці між заданим часом і поточним часом у секундах. Якщо число від’ємне, ми мусимо додати секунди протягом цілого дня (якщо бути точним 86400), щоб отримати секунди, які нам доведеться спати, і якщо число є позитивним, ми можемо просто використовувати його.


Що станеться, якщо системний годинник рухається вперед / назад (наприклад: ntp).
WhyNotHugo

10

Припустимо, що це сценарій оболонки, це має працювати:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

Це за 24 години. Якщо ви хочете, щоб це продовжувалось як в 4:00, так і в 16:00, скористайтеся цим:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

Це може бути варіантом. У мене просто була ідея. Я повернусь через кілька хвилин.
BrainStone

0

На OpenBSD можна скористатись наступним для компактного */55-хвилинного crontab(5)завдання на 00щогодинний час (щоб переконатися, що генерується менше електронних листів, виконуючи все те саме завдання з певними інтервалами):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

Зауважте, що також date(1)буде порушено sleep(1)дизайн за остаточною ітерацією, оскільки 60хвилини не є дійсним часом (якщо це не так!), Тому нам не доведеться чекати зайвого часу до отримання нашого електронного звіту.

Також зауважте, що якщо одна з ітерацій буде відведена на неї більше 5 хвилин, вона sleepтакож милозвучно вийде з ладу, не спавши взагалі (через те, що негативне число інтерпретується як варіант командного рядка, а не загортання на наступну годину чи навіть вічність), таким чином переконайтеся, що ваша робота може все-таки закінчитися протягом відведеної години (наприклад, якщо лише одна ітерація займає трохи більше 5 хвилин, ми все одно матимемо час наздогнати, без що завгодно до наступної години).

printf(1)Необхідно , тому що dateпередбачається рівно дві цифри для хвилин специфікації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.