问题:设置了定时任务,发现任务未执行
[root@master ~]# crontab -l
18 11 * * * echo aaa > /tmp/test 2>&1
59 5 * * * rm -rf /tmp/*2022*
排查过程
1. 查看定时任务日志/var/log/messages,没找到对应执行记录,说明该任务未被执行;查看另一个定时任务,发现被执行了,但执行时间比设定的时间晚了8H
[root@master ~]# grep 'echo aaa' /var/log/cron
[root@master ~]# grep 'rm -rf' /var/log/cron
Nov 1 13:59:01 master CROND[36192]: (root) CMD (rm -rf /tmp/*2022*)
2. 查看系统时间、硬件时间和时间类型,发现都没问题
[root@master ~]# date -R
Tue, 01 Nov 2022 14:02:54 +0800
[root@master ~]# hwclock -r
2022年11月01日 星期二 14时03分02秒 -0.381650 秒
[root@master ~]# timedatectl
Local time: 二 2022-11-01 14:03:43 CST
Universal time: 二 2022-11-01 06:03:43 UTC
RTC time: 二 2022-11-01 06:03:43
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
3. 查看/etc/crontab文件是否对定时任务做了特殊设置
[root@master ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
4. 查看是否修改过系统时间
[root@master ~]# history |egrep 'timedatectl|/etc/localtime'
614 [2022-11-01-10:30:56]timedatectl set-timezone 'Asia/Shanghai'
5. 查看crontab启动时间,发现crontab10:09启动,10:30修改了系统时间为CST
[root@master ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 二 2022-11-01 10:09:06 CST; 4h 10min ago
Main PID: 6929 (crond)
Tasks: 1
Memory: 660.0K
CGroup: /system.slice/crond.service
└─6929 /usr/sbin/crond -n
11月 01 11:09:06 master systemd[1]: Started Command Scheduler.
11月 01 11:09:06 master crond[6929]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 96% if used.)
11月 01 11:09:06 master crond[6929]: (CRON) INFO (running with inotify support)
11月 01 11:09:06 master crond[6929]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
11月 01 11:16:01 master crond[6929]: (root) RELOAD (/var/spool/cron/root)
11月 01 11:23:01 master crond[6929]: (root) RELOAD (/var/spool/cron/root)
11月 01 13:54:01 master crond[6929]: (root) RELOAD (/var/spool/cron/root)
11月 01 13:57:01 master crond[6929]: (root) RELOAD (/var/spool/cron/root)
排查结果
修改系统时间后没重启crontab,导致定时任务按修改前的系统时间(UTC)执行
解决方案
重启crontab服务:systemctl restart crond.service 重启后调整定时任务时间,发现执行时间正常
如果执行时间还是不对,重启rsyslog服务:systemctl restart rsyslog.service
相关知识
UTC(Universal Time Coordinated,协调世界时):协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。是我们现在用的时间标准,根据原子钟来计算时间
GMT(Greenwich Mean Time,格林威治标准时间):规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。是老的时间计量标准,根据地球的自转和公转来计算时间。GMT=UTC+0
CST(China Standard Time,中国标准时间):CST=UTC+8
DST(Daylight Saving Time,夏令时):在夏天太阳升起的比较早时将时钟拨快一小时,是一种为节约能源而人为规定地方时间的制度(中国已不再使用)
RTC(Real_Time Clock,实时时钟):通常称为时钟芯片,供精确的实时时间,或者为电子系统提供精确的时间基准,大多采用精度较高的晶体振荡器作为时钟源
CentOS7修改系统时间
方法1
# timedatectl set-timezone 'Asia/Shanghai'
# timedatectl set-time "YYYY-MM-DD HH:MM:SS"
方法2
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改系统时间后记得重启crontab:systemctl restart crond.service 不然可能导致定时任务不按指定时间执行
系统时间与硬件时间同步
# hwclock -s 从硬件时钟设置系统时间
# hwclock -w 从当前系统时间设置硬件时钟
搜索解决方案时还发现一个libc.so.6导致时区设置无效的解决方案: