处理多个时区的 cron 替代品

处理多个时区的 cron 替代品

我正在寻找一个 cron 替代品(或者如果可能的话,cron 中的一种方法),它可以允许在任意数量的时区(特别是每个用户/文件多个时区)安排作业。我想要的是能够为每个作业(或 cron 行)指定一个时区,然后只指定本地时区的时间。我注意到我可以更改 cron 运行的整个时区,但最终它只能在一个时区运行。

我当前的解决方案是将所有时间转换为格林威治标准时间 (GMT) 并相应地运行作业,唯一的问题是在夏令时转换周期间,必须进行许多手动编辑以确保一切在相应的当地时区正确运行(例如某些地区不遵循夏令时,或者它们不会在同一日期更改)。

对此有什么想法吗?

答案1

我认为您试图同时实现这两种方式,但现实情况是您做不到。例如,如果您希望作业在当地时间上午 8 点运行,无论夏令时是否处于活动状态,那么您要么在当地时间运行系统(和 cron)并且不进行季节性编辑,要么在 UTC(不是 GMT)运行它并进行季节性编辑。如果您希望作业在相同的 UTC 运行,不管,然后您根据 UTC 运行 cron,无需执行其他任何操作。

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

如果你告诉我们你真正想要实现的目标

答案2

克隆支持该功能。

来自“时区”选项的文档crontab(5)

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

答案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)

答案4

有一个来自 darwin 的 launchd 端口,适用于 FreeBSD,如果您使用的是 FreeBSD,它可以做您想做的一切。

https://github.com/freebsd/openlaunchd

还有 jobd,适用于 *BSD 和 Linux。

https://github.com/mheily/jobd

相关内容