Answers:
我认为您正在尝试同时使用它,而现实是您做不到。例如,如果您希望作业在本地时间上午8点运行,则无论夏令时是否处于活动状态,那么您要么在本地时间运行系统(和cron),不进行季节性编辑,要么在UTC中运行它(而不是GMT),并进行季节性修改。如果您希望您的作业在相同的UTC上运行,而不管,那么您可以根据UTC运行cron,则无需执行其他操作。
如果您希望用户能够根据其本地时区安排cron作业,而不必为了方便而考虑转换,那么您可以编写一个接受cron规范和时区的转换脚本,然后在后台将其转换为UTC并为他编辑crontab。它甚至可以是双向转换,以处理对现有条目的更改。
如果您告诉我们您实际要完成的工作,这将很有帮助。
fcron支持此功能。
从fcrontab(5)中 “ timezone”选项的文档中:
在给定的时区中运行作业。timezone-name是对环境变量TZ有效的字符串:有关更多详细信息,请参见系统的文档。例如,“欧洲/巴黎”在Linux系统上有效。此选项可以正确处理夏令时更改。运行定义此选项的作业时,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)
我建议您使用世界标准时间(UTC),它不受夏时制的影响。请参阅“时间轴上没有中断的冬季和夏季切换”的答案。。这通常也是对系统时间最好的选择。
darwin为FreeBSD提供了一个启动端口,如果您使用的是FreeBSD,它将完成您想要的一切。
https://github.com/freebsd/openlaunchd
并且有针对* BSD和Linux的作业。
fcron
似乎已经很旧了,而且没有默认安装ubuntu
。还有其他解决方案吗?