我已经设置了 ACPI 唤醒,这样我的笔记本电脑每天早上都会在某个时间唤醒。时区是 UTC。我想使用 UTC 设置我的 crontab,以便它们与唤醒闹钟相符。
你怎么做呢?
我尝试进行编辑/etc/default/cron
以包括:
TZ="UTC"
但它不起作用。(我也试过TZ=UTC
了TZ="UTC/GMT"
)
有任何想法吗?
答案1
我在 Trusty (14.04) 上遇到了类似的问题。通过设置机器的时区然后重新启动cron
服务解决了这个问题
sudo dpkg-reconfigure tzdata
- 按照说明选择地区/国家sudo service cron restart
timedatectl
- 验证您的日期设置
答案2
没有简单的方法可以实现这一点。cron 使用本地时间。/etc/default/cron
并且TZ
crontab 中的其他规范仅指定TZ
应为 cron 启动的进程使用什么,它不会影响启动时间。
我见过的大多数解决方案都涉及中间的一个实用程序,因此 cron 会启动某些东西,然后确定何时以 UTC 启动(例如,如果您知道您只关心 DST 变化,则在 2 小时前启动它,计算时差,然后启动它。看一下at
。为此,人们经常使用perl
或python
或类似的脚本语言)。
如果您愿意,有一种卑鄙的方法来破解它。 cron 仅在启动时从系统读取 TZ 信息。 因此,如果这是一个一直运行的服务器,您只需将 TZ 设置为 UTC,重新启动,然后在启动后将其设置为您的本地时区。 您也可以编写脚本。
作为一种替代方法,还可以看看@reboot
cron 的语法,它应该在启动后执行脚本,这听起来像您想要的。
答案3
有一个控制系统时区的文件..我刚刚遇到了同样的问题,解决方案如下:
如果您没有手动配置任何时区,运行date
应该显示 UTC 时间。
创建备份
sudo cp /etc/localtime /etc/localtime.bkp
删除文件:
sudo rm /etc/localtime
我住在芝加哥,(您可能需要更改路径,使用 Tab 键有帮助)所以:
sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime
然后重启。系统启动时执行:date
现在您的时区应该在那里,并且 cron 将会查看它。
仅供参考:设置 TZ 变量是一个临时解决方案,有时可能充当“掩码”。
答案4
好的,我花了一些时间弄清楚了如何在 Ubuntu Natty 上做到这一点,下面是我让它工作的方法。可能有更优雅的方法,但这种方法可行。
首先,我们需要将 cron 可执行文件包装在设置 TZ 变量的 shell 中。操作如下:
cd /usr/sbin
mv cron cron.real
然后,创建一个新的 /usr/sbin/cron 文件。我使用了 vim,但您可以使用任何您想要的编辑器,只需使文件看起来像这样:
#!/bin/bash
export TZ=UTC
/usr/sbin/cron.real
使新的 cron 文件可执行:
chmod ugo+rx cron
现在,重新启动 cron 守护进程:
service cron restart
您的 cron 作业现在将按照基于 UTC 的时间表运行 - 但是,即使执行时间是 UTC,运行时它们的时区仍将设置为系统定义的时区。要更改此设置,请在 crontab 中的任何命令之前添加以下内容:
TZ=UTC
因此你的 crontab 将会是这样的:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
TZ=UTC
00 19 * * * date > /tmp/date.log