Замена cron, которая обрабатывает несколько часовых поясов


8

Я ищу замену cron (или метод в cron, если это вообще возможно), который может позволить планировать задания в любом количестве часовых поясов (в частности, более одного на пользователя / файл). Что мне нужно, так это возможность указать часовой пояс для каждого задания (или cron line), а затем указывать только время в местных часовых поясах. Я заметил, что могу изменить весь часовой пояс, в котором запускается cron, но в конце дня он может работать только в одном часовом поясе.

Мое текущее решение состоит в том, чтобы преобразовать все мое время в GMT и запускать задания соответствующим образом, единственная проблема заключается в переходе на летнее время недели, многие ручные изменения должны быть выполнены, чтобы убедиться, что все работает правильно в соответствующем местном часовом поясе (например, некоторые регионы не следуют за переходом на летнее время или не изменяются на одну и ту же дату).

Есть мысли по этому поводу?

Ответы:


3

Я думаю, что вы пытаетесь сделать это обоими способами, и реальность такова, что вы просто не можете. Если вы хотите, чтобы задание выполнялось, например, в 8 часов утра по местному времени, независимо от того, активно ли летнее время, вы либо запускаете свою систему (и cron) по местному времени и не выполняете сезонное редактирование, либо запускаете его в UTC ( не по Гринвичу) и делать сезонные правки. Если вы хотите, чтобы ваши задания выполнялись в один и тот же UTC, независимо от этого , тогда вы запускаете cron в соответствии с UTC, и больше ничего не нужно делать.

Если вы хотите, чтобы пользователь мог планировать работу cron в соответствии со своим часовым поясом и не заставлять его думать о преобразованиях для его удобства, тогда вы пишете сценарий преобразования, который принимает спецификацию cron и часовой пояс, а затем За кулисами выполняет преобразование в UTC и редактирует для него crontab. Это может быть даже двустороннее преобразование для обработки изменений существующих записей.

Будет полезно, если вы расскажете нам, чего вы на самом деле пытаетесь достичь .


6

fcron поддерживает эту функцию.

Из документации по опции «часовой пояс» в fcrontab (5) :

Запустите задание в заданном часовом поясе. timezone-name - это строка, которая действительна для переменной окружения TZ: более подробную информацию смотрите в документации вашей системы. Например, «Европа / Париж» действует в системе Linux. Эта опция правильно обрабатывает переход на летнее время. Переменная окружения TZ устанавливается в значение часового пояса, когда выполняется задание, определяющее эту опцию.


fcronкажется довольно старым и не имеет установки по умолчанию в ubuntu. Есть ли другое решение?
Silgon

Похоже, что fcron был удален из Debian в 2011 году из-за того, что он «сломан и устарел» :(
Питер Грин,

3

Вы можете написать себе небольшую обертку, которая принимает три аргумента:

  • Целевой часовой пояс, соответствующий часу
  • Целевой часовой пояс
  • Команда для запуска, если целевой час tz соответствует текущему часу (в целевом tz).

Затем просто поместите эту строку-обертку в ваш crontab, чтобы запускать каждый час

python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"

Простая версия Python:

#!/usr/bin/python
import sys, os, datetime
import pytz

arg_hour = sys.argv[1]
arg_timezone = sys.argv[2]
arg_cmd = sys.argv[3]

target_tz = pytz.timezone(arg_timezone)
target_hour = pytz.utc.localize(datetime.datetime.utcnow()).astimezone(target_tz).strftime("%H")

if target_hour == str(arg_hour):
    os.system(arg_cmd)

0

Я рекомендую использовать всемирное координированное время (UTC), оно не зависит от перехода на летнее время. Смотрите ответы на «зимнее и летнее время без перерыва на временной шкале». , Это то, что обычно лучше для системного времени.


Я полагаю, что не достаточно ясно изложил свой вопрос ... Моя проблема в том, что мне нужны рабочие места для работы в 8:00 по местному времени в регионе (скажем, Южная Африка / Йоханнесбург). Когда происходит переход на летнее время, смещение UTC в конечном итоге изменится для учета нового местного времени, и для этого потребуется ручное редактирование. Это имеет смысл, или я что-то здесь упускаю?
Мгрей

Посмотрите, что сказал Деннис, он прав :-)
Кайл Брандт

0

Существует порт launchd от darwin для FreeBSD, который будет делать все, что вы хотите, если вы находитесь на FreeBSD.

https://github.com/freebsd/openlaunchd

И есть jobd, который предназначен для * BSD и Linux.

https://github.com/mheily/jobd


1
Можно ли поделиться частью конфигурации или ссылкой, где можно было бы увидеть, как настроить часовой пояс для данной работы?
Silgon

-1

Cfengine - это то, как мы это делаем. Вы можете настроить работу, используя местное время (которое адаптируется к летнему времени) или GMT для одновременных работ. Вы можете создать любой собственный календарь, за исключением. Я знаю, что вы можете заплатить кучу денег за планирование программ, но нам никогда не требовалось ничего большего, даже если центры обработки данных расположены в 3 точках по всему миру.

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