centos7 crontab未执行问题排查

问题:设置了定时任务,发现任务未执行

[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导致时区设置无效的解决方案:

centos6 时区设置无效 - SegmentFault 思否

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 CentOS7 上利用 crontab 定时执行 Python 脚本的详细流程: 1. 编写 Python 脚本 在你的 CentOS7 中,打开一个文本编辑器,比如 vim,然后编写一个 Python 脚本,比如: ```python #!/usr/bin/env python3 print("Hello, world!") ``` 保存并退出。 2. 给 Python 脚本添加执行权限 在终端中,运行以下命令,给 Python 脚本添加执行权限: ```bash chmod +x /path/to/your/python/script.py ``` 3. 打开 crontab 编辑器 在终端中,运行以下命令,打开 crontab 编辑器: ```bash crontab -e ``` 4. 编写 crontab 定时任务 在 crontab 编辑器中,编写以下内容: ``` * * * * * /path/to/your/python/script.py > /dev/null 2>&1 ``` 其中,`* * * * *` 表示每分钟都执行一次,你可以根据自己的需求修改。`/path/to/your/python/script.py` 是你的 Python 脚本的路径,记得用实际路径替换。`> /dev/null 2>&1` 表示将输出重定向到空设备,避免产生无用的输出信息。 5. 保存并退出 crontab 编辑器 在 crontab 编辑器中,按下 `Ctrl` + `X`,然后输入 `Y`,最后按下 `Enter` 保存并退出。 6. 查看 crontab 任务 在终端中,运行以下命令,查看当前用户的 crontab 任务: ```bash crontab -l ``` 你应该能看到你刚刚添加的 crontab 任务。 7. 检查定时任务是否执行 等待一分钟左右,然后查看你的 Python 脚本是否被执行。你可以在 Python 脚本中添加一些输出语句,方便你检查是否执行成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值