Linux crontab 不支持秒级调度,最小单位为分钟;实现秒级执行需改用 while 循环守护进程或 systemd timer 方案,并注意 PATH、权限和日志等关键配置。

Linux 原生 crontab 不支持秒级调度,它每分钟只扫描一次任务列表,最小时间单位是分钟。想实现真正稳定的秒级执行(比如每 5 秒跑一次脚本),不能靠改 crontab 语法“蒙混过关”,而要换思路——用更合适的技术方案替代或补充。
用 while 循环封装成守护进程
这是最常用、门槛最低的方案,适合单机轻量运维场景。核心是写一个带 sleep 的无限循环脚本,并确保它只运行一个实例:
- 脚本开头加文件锁(如
/tmp/myscript.lock),防止 crontab 多次触发导致重复进程 - 用
while true; do ...; sleep N; done控制间隔,N 就是你要的秒数 - 所有命令路径写绝对路径(
/usr/bin/python3而不是python3),避免环境变量缺失问题 - crontab 只负责启动一次:例如
@reboot /bin/bash /opt/scripts/runner.sh &,或0 * * * * /bin/bash /opt/scripts/runner.sh &
用 systemd timer 精确管理
如果你的系统使用 systemd(主流发行版默认),这是更现代、更可靠的选择。它支持毫秒级精度、依赖管理、失败重试和日志集成:
- 写一个 service 文件(如
/etc/systemd/system/mytask.service),定义要执行的脚本 - 再写一个同名 timer 文件(
mytask.timer),用OnUnitActiveSec=5s或OnCalendar=*+AccuracySec=1s实现秒级触发 - 启用并启动:
systemctl daemon-reload && systemctl enable --now mytask.timer - 状态查看:
systemctl list-timers或journalctl -u mytask.service -n 20
避免踩坑的三个关键点
很多“脚本能手动跑,cron 就不执行”的问题,其实和秒级无关,而是基础配置出错:
-
PATH 和环境变量不同:crond 启动时只加载极简环境,
python、node、虚拟环境路径都要显式写全 -
脚本没执行权限:
chmod +x /path/to/script.sh缺一不可 - 日志没重定向或没落盘:建议把 stdout/stderr 都追加到独立日志文件,方便排查某次执行是否超时、失败或被 kill
什么情况该换其他方案
如果任务频率极高(如每秒多次)、需跨多台机器协同、或已有 Python/Node.js 服务在运行,可考虑内嵌调度:
- Python 项目可用
schedule库或APScheduler,在主进程中启动后台调度线程 - Node.js 可用
node-schedule或setTimeout递归调用 - 高频监控类任务,也可用
watch -n 1 'command'快速验证,但不建议长期生产使用


















