QuartzScheduler 中有这个东西,我们可以说在 CST/BST/ 或任何时区执行它。当您想要在某些时区执行某些作业以及在其他时区执行某些作业时,这也很好。
在 crontab 中是否有类似的东西,我们可以指定时区,因为我多次看到人们在时区更改时发疯,他们必须浏览 crontab 中的作业列表,在那里他们必须更改时间。
I am looking for something where we can execute certain jobs in certain timezones and certain other jobs in some other timezones.
答案1
这取决于您的发行版:某些版本的 Cron 支持这一点,其他版本则不支持。例如,在 Debian 上:
限制
cron 守护进程以定义的时区运行。目前它不支持每用户时区。所有任务:系统和用户的任务将根据配置的时区运行。即使用户TZ
在其 crontab 中指定环境变量,也只会影响 crontab 中执行的命令,而不影响 crontab 任务本身的执行。
而在 Fedora 上:
指定
CRON_TZ
cron 表特定的时区。用户在指定时区的时间中输入所选表时间。日志中的时间取自守护程序运行所在的本地时区。
man 5 crontab
因此,请检查系统上的crontab 手册页 ( )。 (以上两段内容均来自相应系统的手册页。)
答案2
似乎没有通用的方法来告诉cron
在指定的每个用户(或每个作业)时区安排作业。
但解决这个问题应该不难。例如,如果您想在太平洋标准时间每天上午 10:30 运行作业,您可以编写一个包装器并在每小时后 30 分钟调用它:
30 * * * * wrapper ...
然后,包装器可以在内部设置自己的时区,然后仅当当前时间(接近)上午 10:30 时才执行指定的命令。它必须允许一点偏差,因为它不会在确切地整点后 30 分钟。
如果它足够有用,我可能会自己写一个这样的包装器。我正在考虑这样的语法:
cron-wrapper -tz [zone] -time [time] command args...
或者,更简单地说,它可能只是将时间指定为 UTC 并省略时区规范(这避免了必须决定指定时区的语法)。
需要明确的是,您的要求是,例如,即使您当前使用 CDT(中部夏令时间),也要在指定的 CST(美国中部标准时间)时间运行作业,以便该作业始终每 24 小时执行一次?那么您希望它在半年的上午 10:30 和另一半年的上午 11:30 运行? (大多数人希望作业每天都在一致的挂钟时间运行——这并不意味着您应该这样做,但这就是cron
支持的用法。)