处理多个时区的cronreplace程序

我正在寻找可以允许在任何时区(特别是每个用户/文件多于一个)安排作业的cronreplace(或者cron中的方法)。 我想要的是能够指定每个作业(或cron行)的时区,然后只在本地时区指定时间。 我注意到,我可以更改整个时区的cron运行,但在一天结束时,它只能运行在一个时区。

我目前的解决scheme是将我所有的时间转换为GMT,并相应地运行作业,唯一的问题是在夏时制转换周期间,必须进行许多手动编辑才能确保在当地时区正确运行(例如某些地区不遵守夏令时,或者不在同一天更换)。

对此有何想法?

我认为你想要双方都有,而现实就是你不能。 例如,如果您想在当地时间上午8点运行作业,则无论夏令时是否处于活动状态,您都要在当地时间运行系统(和cron),而不要进行季节性编辑,或者以UTC(UTC不是GMT),并进行季节性编辑。 如果你希望你的工作在同一个UTC上运行,那么你可以根据UTC运行cron,没有什么可做的了。

如果你想要的是一个用户能够按照当地时区安排一个cron作业,而不需要为了方便而考虑转换那么你就可以编写一个转换脚本来接受一个cron规范和一个时区在幕后转换为UTC并为他编辑crontab。 它甚至可以是双向转换来处理对现有条目的更改。

如果你告诉我们你实际上想要完成什么,这将会很有帮助。

fcron支持这个function。

从fcrontab(5)中的“timezone”选项的文档:

在给定的时区运行作业。 timezone-name是一个对环境variablesTZ有效的string:请参阅系统文档以获取更多详细信息。 例如,“欧洲/巴黎”在Linux系统上是有效的。 该选项正确处理夏令时更改。 定义此选项的作业运行时,TZ环境variables设置为时区的值。

你可以自己写一个包装,它需要三个参数:

  • 目标时区小时匹配
  • 目标时区
  • 命令运行,如果目标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) 

我build议您使用协调世界时 (UTC),但不受夏时制的影响。 查看“时间轴上的冬季和夏季时间切换不中断”的答案。 。 这也是系统时间最好的。

Cfengine是我们这样做的方式。 您可以使用当地时间(适应夏令时)或同时作业的GMT设置作业。 您可以创build任何types的自定义日历,但有例外情况。 我知道你可以花费大量的时间安排软件,但是我们甚至不需要任何其他的东西,甚至在世界各地的三个地方都有数据中心。