Каков наилучший способ сравнения временных меток в Bash? - PullRequest
37 голосов
/ 15 октября 2008

У меня есть сценарий оповещения, который я пытаюсь удержать от спама, поэтому я хотел бы поставить условие, что если оповещение было отправлено в течение, скажем, последнего часа, не отправлять другое оповещение. Теперь у меня есть задание cron, которое проверяет состояние каждую минуту, потому что мне нужно быстро получать уведомление, когда условие выполняется, но мне не нужно получать электронное письмо каждую минуту, пока я не получу контроль над проблемой. Каков наилучший способ сравнить время в bash для достижения этой цели?

Ответы [ 3 ]

61 голосов
/ 15 октября 2008

Безусловно, проще всего хранить временные метки как времена модификации фиктивных файлов. Команды GNU touch и date могут устанавливать / получать это время и выполнять вычисления даты. Bash имеет тесты для проверки того, является ли файл новее (-nt) или старше (-ot) другого.

Например, чтобы отправить уведомление только в том случае, если последнее уведомление было более часа назад:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi
19 голосов
/ 15 октября 2008

Используйте «тест»:

if test file1 -nt file2; then
   # file1 is newer than file2
fi

РЕДАКТИРОВАТЬ: Если вы хотите знать, когда произошло событие, вы можете использовать «touch», чтобы создать файл, который вы можете позже сравнить с помощью «test».

14 голосов
/ 15 октября 2008

Используйте команду даты, чтобы преобразовать два раза в стандартный формат и вычесть их. Возможно, вы захотите сохранить предыдущее время выполнения в точечном файле, а затем сделать что-то вроде:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(Спасибо, Стив.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...