Хороший способ сравнить время?


10

Мне нужно проверить текущее время и прервать сценарий, если это не подходящее время суток, когда я должен его запустить. Кроме того, если кто-то еще запускает его, он должен прерваться.

Например: мне нужно, чтобы мой скрипт запускался только в том случае, если он запущен между 22:00 и 2:00 (4-часовое окно).

В настоящее время я делаю следующее. Не торопитесь date +%k%Mи сравнивайте с жестко закодированными числами

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

Я хотел бы знать, есть ли другой эффективный метод в отношении сравнения времени в shили bash?


1
Если вам нужно сравнить две даты попытаться преобразовать их в MJD или UNIX время, например: date +%s.
Eddy_Em

1
@ Эдди нет, это не дата, мне нужно сравнить время.
MTK

1
Думаю, через несколько секунд было бы лучше: currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then
Eddy_Em

почему бы не поставить скрипт в crontab? таким образом вы гарантируете, что он будет запущен в указанное время
BitsOfNix

1
Поскольку любой пользователь может изменить время для процесса faketime, ваш сценарий не очень безопасен. Использование файлов блокировки, вероятно, является лучшим вариантом.
2011 года

Ответы:


6

Это выглядит идеально для меня. Что заставляет вас думать, что это должно быть улучшено?

В любом случае, способы улучшить это могут быть:

  • Используйте меньшую, более быструю оболочку, чем bash, например, dash или pdksh.
  • использовать оболочку, которая имеет встроенные функции даты zshилиksh93
  • use gawk(который меньше, чем bash, но не dash, но может избежать лишней вилки):

Пример:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}

ладно, круто. Просто хотел подтвердить, что то, что я делаю, не является грубым или злым. Спасибо за предложения.
MTK

4

Если внешние инструменты разрешены, вы можете проверить dateutils.

Ваш "сценарий" становится:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

Отказ от ответственности: я являюсь автором указанного инструмента.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.