cron 在不同的时区运行,并且日期命令显示不同的时区

cron 在不同的时区运行,并且日期命令显示不同的时区

我有 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

Timzone 仅适用于日志文件吗?

答案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”被修改为用户配置的时区。

相关内容