Debian 定时器时间不准确的排查与修复
一、先校准系统时间与时区
timedatectl。确保 Time zone 正确(如 Asia/Shanghai),以及 System clock synchronized: yes。sudo timedatectl set-timezone Asia/Shanghai。sudo apt install systemd-timesyncd;编辑 /etc/systemd/timesyncd.conf 设置 NTP= 服务器;重启服务 sudo systemctl restart systemd-timesyncd.service;验证 timedatectl。sudo apt install chrony;编辑 /etc/chrony/chrony.conf 添加 server ntp.aliyun.com iburst 等;重启 sudo systemctl restart chronyd;验证 chronyc tracking 与 chronyc sources -v。sudo apt install ntp 或 ntpsec;编辑 /etc/ntp.conf 配置上游服务器;重启服务;如需一次性强同步可用 sudo ntpdate ntp.aliyun.com(可能需临时停止 chrony/timesyncd)。sudo hwclock -w(将系统时间写入 RTC,避免重启后漂移)。二、若使用的是 systemd 定时器
systemctl list-timers --all;查看状态:systemctl status your.timer;查看详细属性:systemctl show your.timer(关注 Next Elapsed、OnCalendar 等)。journalctl -u your.timer -b -e。AccuracySec=1s(将触发精度提升到秒级,默认可能按分钟对齐);必要时使用 RandomizedDelaySec=1m 避免“惊群”。Persistent=true。[Timer]
OnCalendar=*-*-* *:*:00
AccuracySec=1s
RandomizedDelaySec=1m
Persistent=true
Unit=your.service
sudo systemctl daemon-reload && sudo systemctl restart your.timer。systemctl start your.service 验证脚本可运行,再观察定时器是否按 OnCalendar 触发。三、若使用的是 Cron
crontab -l;系统级任务查看 /etc/crontab 与 /var/spool/cron/crontabs/;时间字段顺序为:分 时 日 月 周。systemctl status cron;未运行则 sudo systemctl start cron && sudo systemctl enable cron。grep CRON /var/log/syslog,定位是否按时触发、是否有报错。PATH/SHELL)。四、快速排查清单
timedatectl;若偏差大,先手动校正(如 ntpdate 或 date -s),再启用 NTP 长期同步。systemctl list-timers --all、systemctl status your.timer、journalctl -u your.timer。systemctl status cron、crontab -l、grep CRON /var/log/syslog。AccuracySec=1s;Cron 的最小粒度为1分钟。Persistent=true 补跑;Cron 需自行设计幂等等逻辑。top/htop 观察,优化任务或分散执行。