Замена cron, которая обрабатывает несколько часовых поясов
Я ищу замену cron (или метод в cron, если это вообще возможно), который может позволить планировать задания в любом количестве часовых поясов (в частности, более одного на пользователя / файл). Что мне нужно, так это возможность указать часовой пояс для каждого задания (или cron line), а затем указывать только время в местных часовых поясах. Я заметил, что могу изменить весь часовой пояс, в котором запускается cron, но в конце дня он может работать только в одном часовом поясе.
Мое текущее решение состоит в том, чтобы преобразовать все мое время в GMT и запускать задания соответственно, единственная проблема заключается в переходных неделях перехода на летнее время, многие ручные изменения должны быть выполнены, чтобы убедиться, что все работает правильно в соответствующем местном часовом поясе (например, некоторые регионы не следуют за переходом на летнее время или не изменяются на одну и ту же дату).
Есть мысли по этому поводу?
6 ответов
Я думаю, что вы пытаетесь сделать это обоими способами, и реальность такова, что вы просто не можете. Если вы хотите, чтобы задание выполнялось, например, в 8 часов утра по местному времени, независимо от того, активно ли летнее время, вы либо запускаете свою систему (и cron) по местному времени и не выполняете сезонное редактирование, либо запускаете его в UTC (не по Гринвичу) и делать сезонные правки. Если вы хотите, чтобы ваши задания выполнялись в один и тот же UTC, независимо от этого, вы запускаете cron в соответствии с UTC, и больше ничего не нужно делать.
Если вы хотите, чтобы пользователь мог планировать работу cron в соответствии со своим часовым поясом и не заставлять его думать о преобразованиях для его удобства, тогда вы пишете сценарий преобразования, который принимает спецификацию cron и часовой пояс, а затем за кулисами выполняет преобразование в UTC и редактирует для него crontab. Это может быть даже двустороннее преобразование для обработки изменений в существующих записях.
Будет полезно, если вы расскажете нам, чего вы на самом деле пытаетесь достичь.
fcron поддерживает эту функцию.
Из документации по опции "часовой пояс" в fcrontab (5):
Запустите задание в заданном часовом поясе. timezone-name - это строка, которая действительна для переменной окружения TZ: более подробную информацию смотрите в документации вашей системы. Например, "Европа / Париж" действует в системе Linux. Эта опция правильно обрабатывает переход на летнее время. Переменная окружения TZ устанавливается в значение часового пояса, когда выполняется задание, определяющее эту опцию.
Вы можете написать себе небольшую обертку, которая принимает три аргумента:
- Целевой часовой пояс, соответствующий часу
- Целевой часовой пояс
- Команда для запуска, если целевой час 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)
Я рекомендую использовать всемирное координированное время (UTC), оно не зависит от перехода на летнее время. Смотрите ответы на "зимнее и летнее время без перерыва на временной шкале"., Это то, что обычно лучше для системного времени.
Существует порт launchd от darwin для FreeBSD, который будет делать все, что вы хотите, если вы находитесь на FreeBSD.
https://github.com/freebsd/openlaunchd
И есть jobd, который предназначен для *BSD и Linux.
Это старый вопрос. На сегодняшний день
cronie
, который теперь кажется стандартным
cron
в
CentOS 7
а также упакован в довольно много стандартных Unix-подобных дистрибутивов, поддерживает
CRON_TZ
. Видеть man 5 crontab
.
CRON_TZ
можно установить несколько раз в одном файле cron, чтобы использовать несколько часовых поясов для определения времени запуска различных заданий. Пример crontab:
CRON_TZ=Etc/GMT+0
* */2 * * * touch ~/temp/cron-0gmt0evenhour
* 1-23/2 * * * touch ~/temp/cron-0gmt1oddhour
CRON_TZ=Etc/GMT+1
* */2 * * * touch ~/temp/cron-1gmt0evenhour
* 1-23/2 * * * touch ~/temp/cron-1gmt1oddhour
Это проверено на правильность работы на /questions/334171/neskolko-ekzemplyarov-crontz-vnutri-fajla-cron-centos/780021#780021.
Cfengine - это то, как мы это делаем. Вы можете настроить работу, используя местное время (которое адаптируется к летнему времени) или GMT для одновременных работ. Вы можете создать любой пользовательский календарь, за исключением. Я знаю, что вы можете заплатить кучу денег за планирование программного обеспечения, но нам никогда не требовалось ничего большего, даже если центры обработки данных расположены в 3 точках по всему миру.