我怎样才能让 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=GMT
或TZ=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:15am
和09: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
这将每小时运行一次,然后确定它是否是正确的小时。