可处理多个时区的Cron替代品


8

我正在寻找一种cron替换(或在cron中尽可能使用一种方法),该替换可以允许在任意数量的时区(特别是每个用户/文件多个)中调度作业。我想要的是能够为每个作业(或cron行)指定时区,然后仅在本地时区中指定时间的功能。我注意到我可以更改cron运行的整个时区,但最终只能在一个时区运行。

我当前的解决方案是将所有时间都转换为GMT并相应地运行作业,唯一的问题是在夏令时转换周期间,必须进行许多手动编辑才能确保事情在各自的本地时区正确运行(例如,某些区域不遵循夏令时,或者它们在同一天没有更改)。

有什么想法吗?

Answers:


3

我认为您正在尝试同时使用它,而现实是您做不到。例如,如果您希望作业在本地时间上午8点运行,则无论夏令时是否处于活动状态,那么您要么在本地时间运行系统(和cron),不进行季节性编辑,要么在UTC中运行它(而不是GMT),并进行季节性修改。如果您希望您的作业在相同的UTC上运行,而不管,那么您可以根据UTC运行cron,则无需执行其他操作。

如果您希望用户能够根据其本地时区安排cron作业,而不必为了方便而考虑转换那么您可以编写一个接受cron规范和时区的转换脚本,然后在后台将其转换为UTC并为他编辑crontab。它甚至可以是双向转换,以处理对现有条目的更改。

如果您告诉我们您实际要完成的工作,这将很有帮助。


6

fcron支持此功能。

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

在给定的时区中运行作业。timezone-name是对环境变量TZ有效的字符串:有关更多详细信息,请参见系统的文档。例如,“欧洲/巴黎”在Linux系统上有效。此选项可以正确处理夏令时更改。运行定义此选项的作业时,TZ环境变量将设置为时区的值。


fcron似乎已经很旧了,而且没有默认安装ubuntu。还有其他解决方案吗?
silgon

似乎fcron在2011年因“破碎和过时”而从Debian中删除:(
Peter Green

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点运行。当发生夏令时时,UTC偏移将最终更改为考虑新的本地时间,并且将需要手动编辑以解决此问题。这有意义吗,还是我在这里错过了什么?
mgray

看看丹尼斯说的话,他是对的:-)
凯尔·勃兰特


-1

cfengine是我们执行此操作的方法。您可以使用本地时间(适合夏时制)或GMT设置同步作业。您可以创建任何类型的自定义日历,但有例外。我知道您可以花很多钱购买调度软件,但即使在全球3个地方都有数据中心,我们也不需要做更多的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.