Я ищу замену cron (или метод в cron, если это вообще возможно), который может позволить планировать задания в любом количестве часовых поясов (в частности, более одного для каждого пользователя / файла). Я хотел бы иметь возможность указывать часовой пояс для каждого задания (или строки cron), а затем указывать только время в местных часовых поясах. Я заметил, что могу изменить весь часовой пояс, в котором работает cron, но в конце дня он может работать только в одном часовом поясе.
Мое текущее решение состоит в том, чтобы преобразовать все мое время в GMT и выполнить задания соответственно, единственная проблема заключается в неделях перехода на летнее время, многие изменения должны выполняться вручную, чтобы убедиться, что все работает правильно в соответствующем местном часовом поясе (например, некоторые в регионах не применяется летнее время или они не меняются в один и тот же день).
Есть мысли по этому поводу?
fcron поддерживает эту функцию.
Из документации параметра "часовой пояс" в fcrontab (5):
Запустите задание в указанном часовом поясе. timezone-name - это строка, которая действительна для переменной среды TZ: см. документацию вашей системы для более подробной информации. Например, «Европа / Париж» действительно в системе Linux. Этот параметр правильно обрабатывает переход на летнее время. Переменная среды TZ устанавливается в значение часового пояса при запуске задания, определяющего этот параметр.
Вы можете написать себе небольшую оболочку, которая принимает три аргумента:
Затем просто поместите эту строку оболочки в свой crontab для ежечасного выполнения:
python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"
Простая версия на питоне:
#!/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)
Я думаю, вы пытаетесь сделать это обоими способами, а на самом деле у вас просто не получается. Если вы хотите, чтобы задание запускалось в 8 утра по местному времени, например, независимо от того, активно ли летнее время, вы либо запускаете свою систему (и cron) по местному времени и не выполняете сезонные изменения, либо запускаете его в UTC ( не по Гринвичу) и вносите сезонные изменения. Если вы хотите, чтобы ваши задания выполнялись в одно и то же время в формате UTC, несмотря на, то вы запускаете cron по UTC, и делать больше нечего.
Если вы хотите, чтобы пользователь мог планировать задание cron в соответствии с его местным часовым поясом и не заставлял его думать о конверсиях для его удобства затем вы пишете скрипт преобразования, который принимает спецификацию cron и часовой пояс, затем выполняет преобразование в UTC за кулисами и редактирует crontab для него. Это может быть даже двустороннее преобразование для обработки изменений существующих записей.
Будет полезно, если вы сообщите нам чего вы на самом деле пытаетесь достичь.
Я рекомендую вам использовать Всемирное координированное время (UTC), переход на летнее время не выполняется. Видеть ответы на «переключение зимнего и летнего времени без перерыва во временной шкале».. Это то, что обычно лучше всего для системного времени.
Существует порт launchd от darwin для FreeBSD, который будет делать все, что вы хотите, если вы используете FreeBSD.
https://github.com/freebsd/openlaunchd
И есть jobd, предназначенный для * BSD и Linux.
Cfengine - это то, как мы это делаем. Вы можете настроить задания, используя местное время (которое адаптируется к летнему времени) или GMT для одновременных заданий. Вы можете создать любой собственный календарь, за исключением. Я знаю, что вы можете заплатить кучу денег за программное обеспечение для планирования, но нам никогда не требовалось ничего большего, даже с центрами обработки данных в трех точках по всему миру.