我正在寻找一个 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。