标准 cron 语法仅含分、时、日、月、周5字段,无“秒”字段;linux crond 静默忽略含秒表达式;合法表达式如 /2 * 表示每两分钟执行一次。

标准 cron 语法只有 5 个字段,别被“秒”字段骗了
你看到的 0/2 * * * * ? 或带“秒”输入框的生成器,基本都混用了 Quartz(Java)或前端自定义逻辑。Linux 系统原生 crond 只认 分 时 日 月 周 这 5 字段,没有“秒”位置。强行把含秒的表达式粘进 crontab -e,会静默忽略整行——连错误提示都没有。
真正能跑在服务器上的合法表达式,必须满足:
-
*/2 * * * *表示“每两分钟执行一次”,不是“每两秒” - 周字段只能是
0-6(0和7都是周日),不能填Sun或sun,否则crontab -e报错bad day-of-week - 日期(第 3 字段)和星期(第 5 字段)同时出现时,cron 要求“二者之一为真”才触发,比如
0 9 1 * 1是“每月 1 号 且 是周一”,不是“每月 1 号 或 每周一”
前端生成器的核心就是安全拼接字符串
一个靠谱的 HTML Cron 生成器不需要后端,纯 JS 就够:把用户选择的“每小时”“第 3 天”“周一到周五”转成对应字段值,再用空格拼成 5 段字符串。关键校验点有三个:
- 步长不能为 0:
*/0是非法语法,JS 里得拦截if (step === 0)并提示“步长不能为 0” - 周字段统一转数字:UI 上显示
Mon/Tue没问题,但提交前必须映射为1/2,并确保0和7都转成0 - 避免空格污染:生成后务必调用
.trim(),否则结尾多一个空格或零宽字符(\u200b),crontab就不认
生成的表达式复制进 crontab 后不生效?先查这三件事
语法对了 ≠ 能跑。用户最常卡在这几个隐形坑上:
-
PATH极窄:crond 不继承你的 shell 环境,curl得写成/usr/bin/curl,php得写成/usr/bin/php,建议用which curl确认绝对路径 -
%符号必须转义:命令里带%(比如date +\%Y-\%m-\%d),不加反斜杠会被 cron 当注释截断,后续内容全丢 - 时区陷阱:你在网页选“每天 9:00”,生成
0 9 * * *,但实际执行时间取决于服务器本地时区,不是你浏览器所在时区;如果服务器用 UTC,而你想要北京时间 9 点,得写成0 1 * * *
需要秒级调度?换方案,别硬改 cron
标准 cron 无法支持秒级,这不是配置问题,是设计限制。强行用 sleep 1 循环写脚本,容易累积延迟、进程失控、日志爆炸。
更稳妥的替代路径:
- 用
systemd timer:支持OnUnitActiveSec=1s,精度高、可控强、自带日志和依赖管理 - 引入
supercronic:Docker 场景友好,语法兼容标准 cron 并扩展秒字段,但需额外部署二进制 - 简单任务直接用循环脚本:开头加
#!/bin/sh,用while true; do your-command; sleep 1; done,记得配nohup和重定向,避免挂起
真正麻烦的从来不是生成表达式,而是搞清它在哪跑、以谁的身份跑、环境变量从哪来——这些细节没对齐,再漂亮的 UI 也救不了任务不触发。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











