如何在格林尼治标准时间而不是当地时间运行cron作业?


8

如何使Cron作业在GMT而非本地时间运行?

这是我的crontab文件:

#m  h           d   m   wday    command
TZ=GMT
5   0,6,12,18   *   *   *   ~/Documents/bash/transfer.sh

我的工作似乎在本地时间(GMT + 11)运行,我正在运行os x snow leopard,但是在开发完成后会将代码移到linux上。

linux环境可能是共享环境,在该环境中,我对配置的控制较少。



Answers:


8

并非所有版本的cron支持都使用系统以外的时区运行作业。

如果是这样,则规格可能应该为TZ=GMTTZ=UTC(不带尖括号)。在某些情况下,变量为CRON_TZ

最好的办法是检查特定于特定系统的文档。请参阅man 5 crontab


3

如果您当地时间是Europe/London。然后:

crontab -e    # or 'cru' on some machines
>>>
# Run COMMAND at 03:15am UTC every morning
15 3 * * * [ "$(date +\%z)" = "+0000" ] && COMMAND
15 4 * * * [ "$(date +\%z)" = "+0100" ] && COMMAND
<<<

另一个例子:

如果您的标准时间+0500的转移UTC,和你这个季节的时间+0600移位UTC。然后添加+5到以上示例中指定的所有小时中。这意味着在正在运行08:15am09:15am您的本地时间分别。因此,修改后的cron行将如下所示:

crontab -e    # or 'cru' on some machines
>>>
# Run COMMAND at 03:15am UTC every morning
15 8 * * * [ "$(date +\%z)" = "+0500" ] && COMMAND
15 9 * * * [ "$(date +\%z)" = "+0600" ] && COMMAND
<<<

[编辑]确保在crontab文件中\转义任何百分比%字符。由于crontab将其解释为换行分隔符。例如%-> \%


1
如果您在使用DST的时区,那么将会有问题,因此(例如)您的时区有时是+01:00,某些是+02:00
inemanja

2
也许您可以详细说明?我不这么认为。我们已经考虑了DST。每个案例都有自己的cron行。1个带/不带DST的设备。
Dreamcat4,2015年

这应该是公认的答案,因为它允许个人命令使用不同的行为
Patrick McCann 2015年

0

您也许可以包装原始的crond二进制文件。

mv /usr/sbin/crond /usr/sbin/crond.real
cat > /usr/sbin/crond
#!/bin/sh
TZ=GMT
export TZ
exec crond.real ${1+"$@"}

你好,赫洛瓦尔,你能解释一下这些步骤吗?
复眼

您要将crond复制到crond.real,然后用一个简短的脚本替换crond,在其中设置和导出TZ,然后执行crond.real?
复眼

不是复制而是移动,但是是的,其余分析都是正确的。
hlovdal
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.