crontab 不支持秒级调度,最小粒度为分钟;可通过 sleep + 多行 crontab 模拟整除60的秒级间隔,或用循环脚本 + 单次 cron 触发实现更可控的秒级任务,高要求场景推荐 systemd timer、supercronic 或应用内定时器。

crontab 本身不支持秒级调度,最小时间粒度是分钟。想实现每秒、每5秒或每30秒执行一次任务,不能靠修改 crontab 时间字段来达成,必须借助其他机制配合使用。
用 sleep + 多行 crontab 模拟固定秒级间隔
适用于间隔能整除60(如1、2、3、4、5、6、10、12、15、20、30秒)的场景。原理是:在1分钟内,让 cron 启动多个带不同 sleep 延迟的命令,错开执行时间。
- 例如每10秒执行一次脚本:
* * * * * /usr/bin/python3 /path/to/script.py
* * * * * sleep 10 && /usr/bin/python3 /path/to/script.py
* * * * * sleep 20 && /usr/bin/python3 /path/to/script.py
* * * * * sleep 30 && /usr/bin/python3 /path/to/script.py
* * * * * sleep 40 && /usr/bin/python3 /path/to/script.py
* * * * * sleep 50 && /usr/bin/python3 /path/to/script.py - 注意:所有行都必须写全,且不能依赖 shell 的并行控制;每条命令由 cron 独立 fork 执行,互不影响
- 缺点:无法保证严格等间隔(受系统负载、命令启动耗时影响),且日志时间戳可能跳变
用循环脚本 + 单次 cron 触发
更常用也更可控的方式:cron 每分钟只启动一次长期运行的循环脚本,由脚本内部用 sleep 控制节奏。
- 写一个可执行脚本(如 /opt/bin/runner.sh):
- 开头加 #!/bin/bash,设置间隔(如 step=5),用 while true 循环 + sleep $step
- 加入简单锁机制防止重复启动(检查 /tmp/runner.lock 是否存在)
- 用 trap "rm -f /tmp/runner.lock" EXIT 确保退出时清理锁文件
- 在 crontab 中仅添加一行:
0 * * * * /bin/bash /opt/bin/runner.sh > /dev/null 2>&1 &
注意边界情况和可靠性问题
直接拼接 60 行 sleep 或写 for 循环看似简单,但容易出问题:
- 若脚本执行时间超过 sleep 间隔,下一轮会堆积,导致实际频率变快甚至资源占满
- 没有进程锁时,每次 cron 触发都会拉起新进程,旧进程可能还在跑,造成并发冲突
- 某些系统默认 shell 是 dash,不支持 {1..60} 语法,建议统一用 while true 配合 break 控制
- 日志混写难排查——应为每次执行生成带时间戳的独立日志,或在脚本中用 date +%s 打点记录
更推荐的替代方案
如果对精度、健壮性或服务管理有更高要求,不建议硬套 crontab:
- systemd timer:支持精度到秒,可定义 OnUnitActiveSec、OnBootSec 等,配合 service 单元自动重启、日志集成、依赖管理
- supercronic:专为容器和高频率设计的 cron 替代品,语法兼容 crontab,但支持秒级字段(如 */5 * * * * *)
- 应用内定时器:Python 用 APScheduler、Node.js 用 node-cron,适合逻辑集中、无需跨进程协调的场景











