cron 能做秒级定时吗
cron 的最小调度粒度是分钟,字段写成六段也不会被识别。要做到秒级周期,现实中有三条路:用 systemd timer 的 OnUnitActiveSec 指定秒级间隔、写一个 sleep 循环脚本、或者把定时逻辑放进应用内部调度器。选哪条路取决于对可靠性与运维成本的要求。
基本信息
| 硬性限制 | cron 最小粒度为一分钟 |
|---|---|
| 可用方案 | systemd timer / sleep 循环脚本 / 应用内调度器 |
| timer 关键项 | OnBootSec、OnUnitActiveSec、AccuracySec |
| 循环脚本特点 | 实现简单,但没有守护能力 |
典型使用场景
- 需要 5 秒级的健康探测或队列检查
- 秒级刷新缓存或同步小批量数据
- 临时实验时用循环脚本快速验证思路
- 业务逻辑紧密耦合的周期动作,放在进程内调度
- 需要精确对齐到某一秒的定时任务
- 替代 cron 处理高于分钟级的频率需求
systemd 秒级方案
systemd 秒级方案
# /etc/systemd/system/check.timer
[Timer]
OnBootSec=10
OnUnitActiveSec=5s
AccuracySec=1s
# 启用
systemctl daemon-reload
systemctl enable --now check.timer
systemctl list-timers check.timer --no-pager # 查看下次触发时间
journalctl -u check.service -n 20 # 查看执行记录循环脚本方案
循环脚本方案
while true; do
/opt/app/check.sh >> /var/log/check.log 2>&1
sleep 5
done
# 简单直接,但崩溃之后不会自愈方案对照
| 方案 | 精度 | 可靠性 |
|---|---|---|
| systemd timer | 秒级,受 AccuracySec 影响 | 高,有日志与依赖管理 |
| sleep 循环脚本 | 近似间隔 | 低,崩溃后不会自愈 |
| 应用内调度 | 取决于实现 | 与业务进程生命周期绑定 |
| cron | 最小一分钟 | 高,但不支持秒级 |
sleep 5 叠加任务耗时 3 秒时,实际间隔会变成 8 秒;需要固定节拍时,用 timer 的日历触发让系统对齐触发点更稳妥。
秒级频率会放大日志量、锁竞争与告警噪音,上线前先确认真有 5 秒级的业务价值,多数场景分钟级已经足够。
循环脚本没有守护能力,进程崩溃后不再恢复。需要长期运行时,把它放进 systemd 单元或容器编排里托管。
如果目的只是错开整点拥堵,用 cron 选非整点时刻或加随机延迟就够了,不必为错峰引入秒级调度,后者的运维成本要高得多。
秒级任务排查更依赖日志:为它单独指定日志位置,并把每次执行的开始与结束时间写进去,才能分清是漏跑还是执行失败。