Есть ли простой способ определить время в тиках, используя дату между сегодняшним днем и некоторым завтрашним днем .
2 ответа
Вы должны быть очень осторожны при использовании временных структур ядра (тики и jiffies предназначались для использования только планировщиком для многозадачных и внутренних процессов ядра).
Linux использует jiffies, а не тики (Windows, Unix и BSD используют тики), и количество времени варьируется в зависимости от архитектуры. На платформе x86 или AMD64 Linux имеет 100 Jiffies в секунду (по умолчанию это можно изменить). Кроме того, нет никакой гарантии, что Jiffy составляет ровно 10 мс, различные факторы могут немного изменить его каждый раз, и в конечном итоге это может привести к существенной разнице.
Ситуация усложняется тем, что новейшие ядра не имеют галочек, их ядра не "просыпаются" через регулярные промежутки времени, чтобы выполнять многозадачность и все такое. Вместо этого каждый раз, когда выполняется "пробуждение", ядро выясняет, когда ему нужно проснуться в следующий раз, и назначает таймер прерывания для запуска в это время. В этих системах нет такой вещи, как галочка или пиктограмма с последовательным распределением времени.
Вдобавок ко всему - я посмотрел на UNIX-определение "Epoch Time", выяснил время начала и конца эпох, представляющих интерес, вычел, а затем масштабировал их до чего угодно.
Теперь, что касается вашего конкретного вопроса об использовании команды DATE(1), справочная страница UNIX для DATE(1) в Руководстве по общим командам BSD имеет следующий пример:
Наконец команда:
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
может использоваться для анализа выходных данных по дате и выражения их во времени эпохи.
В моей системе OSX я получаю:
whmcclos@mbp:~
[3] date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
1391275286
Команда date -r seconds
, вероятно, окажется полезной для проверок работоспособности со значениями времени эпохи, которые вы вычисляете:
whmcclos@mbp:~
[5] date -r 1391275286
Sat Feb 1 09:21:26 PST 2014
Вот еще один подход, который может работать для вас ...
Другой возможной реализацией для выполнения того, что вы пытаетесь сделать, была бы команда UNIX at
, предполагая, что эти виды фоновых заданий выполняются, пока ваш вариант xNIX "спит". В моей системе OSX кажется, что команды, указанные с командой at
, выполняются даже тогда, когда OSX "спит" - у меня действительно включен "power nap", если это как-то связано с этим, но я предлагаю вам рассмотреть:
Во-первых, в OSX команда at
по умолчанию отключена, поэтому я сначала включил ее в соответствии со справочной страницей ATRUN(8) следующим образом:
Execute the following command as root to enable at run:
launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Затем я сделал тест сна следующим образом:
[61] date
Sat Feb 1 11:10:17 PST 2014
whmcclos@mbp:~
[62] at 11:11am today
touch $HOME/created-at-11:11am
job 9 at Sat Feb 1 11:11:00 2014
whmcclos@mbp:~
[63] date
Sat Feb 1 11:10:40 PST 2014
в этот момент я уложил свой ноутбук OSX в сон, пошел на кухню и сделал салат, вернулся и вот результаты:
whmcclos@mbp:~
[64] echo "awakened now"; date
awakened now
Sat Feb 1 11:15:59 PST 2014
whmcclos@mbp:~
[65] ls -l ~/created-at-11\:11am
-rw-r--r--+ 1 whmcclos staff 0 Feb 1 11:11 /Users/whmcclos/created-at-11:11am
Таким образом, это может быть возможно , что реализация вашего конкретного at
команде позволит то , что вы пытаетесь сделать.