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

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

我怎样才能让 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 环境可能是一个共享环境,我可能对配置的控制较少。

答案1

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

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

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

答案2

如果您的当地时间是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 将它们解释为换行符。例如%--> \%

答案3

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

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

答案4

我需要每 3 小时运行一次作业,但使用 UTC 时间,而我的平台不支持使用 CRON_TZ。我的解决方案是其他答案之一的变体:

0 * * * * [ "$(($(TZ=UTC date +\%H) \% 3))" -eq 0 ] && COMMAND

这将每小时运行一次,然后确定它是否是正确的小时。

相关内容