更改cronjob的时区


10

我有一个cronjob,它每天在UTC时间的9:00 AM执行。我在GMT + 1上,因此它在当地时间10:00 AM执行。当时区发生更改(到夏令时,DST)时,cronjob仍在UTC-Time的9:00 AM执行,但在当地时间的11:00 AM执行。但是我希望它始终在10:00执行,无论夏天与否。我怎么做?


4
这个问题是跨张贴在StackOverflow的:stackoverflow.com/questions/29592533/...
John1024

您在/ etc / timezone中设置的时区是什么?
闪烁2015年

Answers:


2

在/ etc / timezone中检查您的设置。在您提到的问题中,您位于“ GMT + 1”中,如果这是您的时区设置的,则脚本将始终在UTC加上一小时执行。如果将其设置为“欧洲/巴黎”,则执行时间将随夏令时而改变。


6

这可能取决于您的操作系统及其的实现cron。在最流行的cron实现中,这是不可能的vixie/isc cron。来自crontab(5) manpage

LIMITATIONS
       The  cron  daemon  runs with a defined timezone. It currently does not 
       support per-user timezones. All the tasks: system's and user's will 
       be run based on the configured timezone. Even if a user specifies  
       the TZ  environment  variable  in  his crontab this will affect only 
       the commands executed in the crontab, not the execution of the crontab 
       tasks themselves.

2

在@Cyrus上扩展答案,这就是我所做的:

我编写了一个检查UTC偏移量的脚本:

#!/bin/bash
export TZ=":US/Eastern"
if [ "$(date +%z)" == "$1" ]; then
  shift
  exec $@
fi

然后,我为所需的偏移量添加两个crontab条目:

0 8 * * * run-only-with-tz.sh -0400 place_your_command_here
0 9 * * * run-only-with-tz.sh -0500 place_your_command_here

1

从手册页:

守护程序将使用/etc/timezone时区的from(如果存在)定义。

可以在用户的​​crontab定义中重新定义环境,但是cron仅在单个时区处理任务。


1

如果您在格林尼治标准时间+1,将您的cronjob移至8:00并睡一小时

0 8 * * * [ "$(date +\%z)" = "+0100" ] && sleep 3600; place_your_command_here

如果您的TZ是北美洲怎么办?
swdev
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.