我有 CentOS,当我date
在 shell 中运行命令时,它返回类似的内容:
2011 年 4 月 28 日星期四 14:08:20 GMT
但是 cron 任务在太平洋标准时间运行。这意味着如果我指定
15 7 * * * 命令
它将在太平洋标准时间 7 点而不是格林威治标准时间 7 点运行。请告诉我为什么会发生这种情况。
谢谢
hwclock 命令的输出:
/usr/sbin/hwclock --utc
无法通过任何已知方法访问硬件时钟。
使用 --debug 选项查看我们搜索访问方法的详细信息。
当我使用调试运行时:
/usr/sbin/hwclock --debug
来自 util-linux-2.13-pre7 的 hwclock hwclock: 打开 /dev/rtc 失败,errno=2:没有这样的文件或目录。未找到可用的时钟接口。无法通过任何已知方法访问硬件时钟
答案1
很可能不是您的问题,但值得一提的是——如果您的 /etc/localtime 在 crond 加载后发生变化,它将继续停留在之前的时区。只需重新启动/重新加载 crond,它就会获取此更改。
另一个“陷阱”是 cron 将遵循 TZ 环境变量。这可以在 crontab 中内联设置,影响其后的任何行,但 TZ 似乎更有可能在加载 crond 的环境中设置。
我刚刚尝试了以下几种变化(调整 hr/min 字段)来确定这两个作业是否/何时运行。填充到 /tmp/tzout.localtime 中的输出也应该会给你一些提示,说明 $TZ 是否以某种方式在加载 crond 的环境中设置。
* * * * * echo $TZ `date` >> /tmp/tzout.localtime
TZ=GMT
* * * * * echo $TZ `date` >> /tmp/tzout.gmt
虽然我不敢说我完全知道你的问题出在哪里,但希望这能对解决方案有所帮助!
答案2
这个问题有点老了,但更改时区并让 crond 识别更改在 CentOS 上仍然是一个问题:我发现在更改时区后,还必须使用以下命令重新启动 syslog 守护进程
/etc/init.d/rsyslog
答案3
有两种方法可以更改时区(至少在 CentOS 5、6、7 上,以及相应的 RHEL 5、6 和 7 发行版、Amazon Linux 和 Amazon Linux 2,分别基于 CentOS 6 和 7),具体取决于您想要影响的范围。
首先,您需要运行tzselect
(选择您的大陆、国家和时区)以获取环境变量的正确值TZ
,然后:
1. 按照它输出的说明,更改从命令行运行的程序的时区,所有交互式 shell 进程(例如,这是我的,显示TZ
美国东部时间的值):
You can make this change permanent for yourself by appending the line
TZ='America/New_York'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
America/New_York
2. 但是要更改 syslog、crond、mysql、apache 以及由 init 系统在启动时生成的任何其他守护进程所使用的“系统”时区,您必须成为 root 并更改这两个文件:
/etc/sysconfig/clock
/etc/localtime
例如,当使用位于德克萨斯州或加利福尼亚州的服务器时,我发现这些指向中部时间或太平洋时间,这对我来说很不方便,并且我们所有的用户、开发人员和系统管理员都在东海岸,因此,要更改系统时间,我执行以下步骤:
# step 1
sudo vim /etc/sysconfig/clock
# change ZONE from UTC (or whatever it is) to your local TZ value:
ZONE="America/New York"
# (but leave this 2nd line alone!)
UTC=True
# step 2: copy your TZ value's dir/file (under zoneinfo) onto /etc/localtime
sudo cp -v /usr/share/zoneinfo/America/New_York /etc/localtime
# step 3
reboot
# Or if all you care about is crond, for instance, just
sudo systemctl restart crond.service # for CentOS 7 / Amazon Linux 2
# Or mysql on older init.d style RHEL 6 / CentOS 6 / Amazon Linux systems:
sudo /etc/init.d/mysqld restart
答案4
我认为“cron”是基于硬件时钟运行的,而不是配置的时区的时钟。尝试查看“hwclock”而不是“date”,因为“date”被修改为用户配置的时区。