两系 cron 服务名不同
cron 守护进程的单元名在各发行版不一致:RHEL/CentOS/Rocky/Alma 上是 crond(cronie 包),Debian/Ubuntu 上是 cron(vixie-cron 血统)。功能都是分钟级调度,差异主要在软件包名、日志去向与容器里的运行方式。写跨发行版脚本时如果硬编码服务名,在另一系会直接 not found,任务部署静默失败。
基本信息
| 适用平台 | RHEL 系与 Debian 系 |
|---|---|
| 服务单元名 | RHEL:crond;Debian/Ubuntu:cron |
| 软件包 | RHEL:cronie;Debian:cron |
| 日志 | RHEL:/var/log/cron;Debian:/var/log/syslog(grep CRON) |
| 任务位置 | /etc/crontab、/etc/cron.d/、/etc/cron.{hourly,daily,weekly,monthly}/ |
典型使用场景
- 编写兼容两系的部署脚本:重启、开机自启、状态断言都要做兼容判断
- 排查“任务没跑”:先确认服务在运行,再在日志里找执行记录
- 容器或精简镜像里确认 cron 是否安装、是否以前台方式运行
- 系统迁移(CentOS 到 Rocky、或迁到 Ubuntu)后核对服务名与日志路径
- 变更前后留存服务状态与执行日志作为取证材料
启停与状态
启停与状态
systemctl status cron --no-pager || systemctl status crond --no-pager # 兼容查询两系
sudo systemctl restart cron 2>/dev/null || sudo systemctl restart crond # 兼容重启
sudo systemctl enable --now cron 2>/dev/null || sudo systemctl enable --now crond
systemctl is-active cron 2>/dev/null || systemctl is-active crond # 脚本里的断言写法
crontab -l # 当前用户任务;crontab -e 编辑
tail -n 50 /var/log/cron # RHEL 系执行日志
grep CRON /var/log/syslog | tail -n 50 # Debian 系执行日志两系对照
| 项目 | RHEL/CentOS/Rocky | Debian/Ubuntu |
|---|---|---|
| 服务单元名 | crond | cron |
| 软件包名 | cronie | cron |
| 执行日志 | /var/log/cron | /var/log/syslog(grep CRON) |
| 改 crontab 是否要重启 | 不需要,守护每分钟重读 | 同样不需要 |
| 容器常见做法 | cron -f 前台运行 | cron -f 前台运行 |
修改 crontab 或 /etc/cron.d 下的文件不需要重启服务:守护进程每分钟重新读取任务表;重启只在服务异常、单元文件被改坏或需要重载环境时才有必要。
Debian 系的 cron 日志走 syslog,journalctl -u cron 往往看不到完整执行记录,排查时要 grep /var/log/syslog;RHEL 系相反,直接看 /var/log/cron 最直接。
cron 的最小粒度是分钟,也不提供补跑:关机期间的时点直接跳过。需要补跑用 anacron 或 systemd timer 的 Persistent,需要秒级调度则要另选调度器。
任务输出默认通过邮件发给任务属主,机器没配 MTA 时日志里会堆满退信记录:常规做法是把输出重定向到文件,或把 MAILTO 变量设为空关闭邮件。
排查任务不执行的标准顺序:先确认服务在运行,再确认 crontab 语法与执行用户,然后确认脚本用绝对路径且环境变量齐全,最后在日志里找是否出现过执行记录;这条链路走完基本能定位绝大多数“没跑”的问题。