Linux系统级定时任务目录分工明确:/etc/crontab需指定用户名和绝对路径;/etc/cron.d/支持模块化文件与环境变量;/etc/cron.hourly等仅接受可执行脚本,不解析crontab语法。

Linux 系统级定时任务目录(/etc/cron.*)不是随意放脚本的地方,而是有明确分工和格式约束的机制集合。用错目录或忽略规范,轻则任务不执行,重则引发权限问题或服务冲突。
/etc/crontab:全局主配置文件,需显式指定用户
这是系统唯一的“中心式”crontab文件,专用于需要明确运行身份的任务(如 root 或特定服务用户)。它和用户 crontab 格式不同——必须包含第六个字段(用户名)。
- 每行格式固定为:分 时 日 月 周 用户名 命令绝对路径
- 命令必须使用绝对路径,不能依赖 PATH 环境变量(例如写
/usr/bin/find,而非find) - 不支持
%字符(若命令中需传递百分号,得写成\%) - 编辑需用
sudo nano /etc/crontab,保存后无需重启 cron,立即生效
/etc/cron.d/:模块化任务目录,按文件粒度管理
该目录是现代运维推荐的系统级任务部署方式,适合多项目、多团队协作或软件包自动注入场景。
- 每个文件可独立命名(如
nginx-logrotate、backup-daily),便于识别来源和职责 - 文件内每行仍需遵循 分 时 日 月 周 用户名 命令 格式,缺一不可
- 文件权限必须设为
644,所有者通常为root:root;权限错误会导致 cron 忽略该文件 - 支持在文件开头声明环境变量(如
SHELL=/bin/bash、PATH=...),影响整个文件内所有任务 - 新增或修改文件后,cron 会自动加载(多数发行版每分钟扫描一次),一般无需手动触发
/etc/cron.hourly、/etc/cron.daily 等:简单周期脚本入口,不解析 crontab 语法
这些目录不接受 crontab 行格式,只接收可执行脚本文件,由系统预设的 wrapper 脚本统一调用。
- 放入的脚本必须有可执行权限(
chmod +x) - 脚本本身负责逻辑判断(比如
/etc/cron.daily/logrotate就是 logrotate 的封装调用) - 执行时间由系统默认策略控制:
cron.daily通常在凌晨 03:00–04:00 间随机启动,避免集群雪崩 - 不适合需要精确到分钟或自定义时间的任务(例如“每天 14:25 执行”就不能放这里)
通用注意事项与避坑点
无论使用哪个目录,以下细节决定任务能否稳定运行:
-
日志重定向要显式处理:建议在命令末尾加上
> /var/log/mytask.log 2>&1,否则输出可能丢失或写入 unexpected 位置 -
环境变量不可靠:cron 启动的 shell 是最小化环境,PATH 往往只有
/usr/bin:/bin;要么在命令中写绝对路径,要么在/etc/cron.d/文件头定义 PATH - 空格与不可见字符敏感:行尾多余空格、tab 混用、Windows 换行符(CRLF)都可能导致语法错误,cron 会静默跳过整行
-
容器环境需额外确认:Alpine、BusyBox 等精简镜像默认不含 cron 守护进程,即使创建了
/etc/cron.d/目录也无效,必须先安装并启用 cron 服务


















