Unix: спати до зазначеного часу


12

Чи є (напів-) стандартна команда Unix, яка б спала до часу, визначеного в її командному рядку? Іншими словами, я шукаю щось подібне sleep, яке зайняло б час пробудження, а не тривалість.

Наприклад: sleeptill 05:00:00

Я можу щось зашифрувати, але краще не вигадувати колесо, якщо там вже щось є.

Питання про бонус: було б чудово, якби він міг прийняти часовий пояс (як в sleeptill 05:00:00 America/New_York).

редагувати Зважаючи на характер того, що я роблю, я шукаю рішення «спати до Т», а не «запустити команду на T».

редагування Для уникнення сумнівів, якщо я запускаю команду о 18:00 і кажу про пробудження о 17:00, я очікую, що вона буде спати 23 години (або, в деяких кутових випадках, пов’язаних із літнім часом, протягом 22 або 24 годин.)


Ви можете використовувати cron, я думаю.
Боббі

Дякую, але за цільовим призначенням воно справді має бути sleepподібним.
NPE

Відповіді:


18

Якщо ви користуєтесь Unix, який має пристойну команду дати та використовуєте bash, ви можете використовувати формат% s для обчислення часу.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 - це 5:00 та -j повідомляє дату, щоб фактично не встановлювати дату)


(+1) для пропозиції. Якщо я запускаю команду о 18:00 і кажу про те, щоб вона прокинулась о 17:00, я вважаю, що вона спить протягом 23 годин (або, у деяких кутових випадках, пов’язаних із літним часовим режимом, 22 або 24 години). Тут пропозиція, на жаль, руйнується. [Мені також довелося змінити на, -jщоб -dвоно працювало на моїх системах Linux.]
NPE

7
@aix: У Linux (та інших системах з датою GNU) ви можете використовувати складні специфікації дати, такі як date -d 'tomorrow 17:00'.
Жил "ТАК - перестань бути злим"

3
@NPE, btw, можна компенсувати за допомогою нагадування-поділу: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(навколо змін DST можуть бути лише деякі проблеми)
hvr

13

Як щодо цього (поєднання ідей 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

9

Перевірте / Linux Unix atкоманди . Використовуючи приклад 5AM:

at 05:00 some_command

Він також підтримує часові пояси:

Ім'я часового поясу GMT, UCT або ZULU (нечутливе до регістру) може слідувати, щоб вказати, що час у загальному координованому часі. Інші часові пояси можна вказати за допомогою змінної середовища TZ.


(+1) для пропозиції. На жаль, це не природно вписується в мій робочий процес. У мене є сценарій, який виконує купу речей послідовно, і я хочу забезпечити, щоб певні кроки не починалися до певного часу. Це, звичайно, можна перетворити на те, що використовує cronабо at, але керувати було б болем. Це причина, що я шукаю щось подібне sleep. Поки що я написав своє.
NPE

А, значить, ви хочете блокувати графік. Чому б не мати файл стану, який слідкує за кожним кроком процесу?
Джеремі L

Можливо, але це звучить дещо складніше, ніж я думаю, що це має бути. Етапи - це різні команди, а сценарій оболонки - це те, що оркеструє робочий процес. Можливість «спати до 17 вечора» у сценарії - це все, що мені дійсно потрібно.
NPE

У такому випадку відповідь w00t може бути саме тим, що ви хочете.
Джеремі L

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