linux 定时任务命令 crontab 与 systemd timer 详解

Linux 定时任务最主流就是crontab(cron),属于老牌标准定时调度,按分钟级别周期执行脚本 / 命令,运维做日志切割、数据备份、定时同步非常常用;另外还有 systemd timer,是 systemd 自带的定时方案,作为 cron 现代替代方案,支持秒级精度、依赖管理、日志更完善。除这两个之外,还有 at 命令,只执行一次性定时任务,不是周期循环。核心重点是 crontab 五段时间表达式语法,这是新手最容易出错的地方,同时掌握 crontab 增删改查、日志排查、权限控制、常见不执行故障排查。

一、crontab 周期定时任务(核心重点)

基础命令

命令功能
crontab -e编辑当前用户定时任务
crontab -l列出当前用户所有定时任务
crontab -r删除当前用户全部定时任务
crontab -u 用户名 -e指定其他用户编辑定时任务(root 权限)
crontab -u 用户名 -l查看指定用户定时任务

crontab 时间表达式(5 位)

分 时 日 月 周 要执行的命令/脚本

字段范围说明
分0-59分钟
时0-23小时
日1-31日期
月1-12月份
周0-7星期,0 和 7 都代表周日

特殊符号

代表每

, 分隔多个值,比如 1,3,5

- 范围,比如 9-18

/ 步长,比如 /5 每 5 分钟

经典示例

每5分钟执行一次备份脚本

/5 /bin/bash /opt/backup.sh

每天凌晨2点执行

0 2 /opt/clean_log.sh

每周一凌晨3点

0 3 1 /opt/weekly_backup.sh

每天8点到18点,每小时整点

0 8-18 /opt/task.sh

重要坑点:crontab 环境变量和交互式 shell 不一样,PATH 不完整,脚本里面命令建议写绝对路径,输出重定向 >> /var/log/cron.log 2>&1 保存错误日志,很多定时任务不执行就是这个原因

cron 相关目录(系统级定时任务)

/etc/crontab 系统全局 crontab 文件,多了用户字段

/etc/cron.d/ 自定义定时任务文件存放目录

/etc/cron.hourly 每小时执行

/etc/cron.daily 每天执行

/etc/cron.weekly 每周执行

/etc/cron.monthly 每月执行

服务管理

CentOS/Rocky

systemctl status crond

systemctl enable crond

Ubuntu/Debian

systemctl status cron

systemctl enable cron

日志位置

/var/log/cron (RHEL 系)

/var/log/syslog (Debian/Ubuntu,grep CRON 查看)

二、at 一次性定时任务

特点:只执行一次,到点运行,不是循环周期任务

基础命令

at 时间

进入交互模式输入要执行命令,Ctrl+D 提交

atq 查看待执行任务

atrm 任务编号 删除 at 任务

示例:今晚 23 点执行脚本

at 23:00

三、systemd timer 现代定时方案

原理:.timer 单元 + 对应的.service 单元,精度更高,日志集成 journald,适合新系统

基础示例

编写 xxx.timer,配置 OnCalendar 定时时间,然后

systemctl daemon-reload

systemctl enable --now xxx.timer

查看状态

systemctl list-timers

四、三种定时方案对比表

方案类型精度优点缺点
crontab cron周期循环最小 1 分钟成熟通用,上手简单不支持秒级,环境变量坑多
at一次性任务分钟级临时单次任务不能循环
systemd timer周期循环支持更高精度和 systemd 集成,日志完善配置相对复杂

五、常见故障排查清单

1 crontab 任务不执行:确认 crond 服务是否启动,脚本权限是否可执行,脚本内命令是否写绝对路径

2 时区错误:系统时区不是 Asia/Shanghai,导致定时时间偏移

3 权限问题:普通用户 crontab 执行 root 权限命令失败

4 脚本本身报错:没有重定向 stderr,看不到报错信息

4 禁用用户:/etc/cron.deny/etc/cron.allow 访问控制,用户被禁止使用 crontab

【常见问题】

问题 1 linux 定时任务命令 crontab 时间表达式一共几位

回答 1 linux 定时任务命令 crontab 标准表达式是 5 位:分 时 日 月 周,最小调度粒度是 1 分钟,不支持秒级定时。

问题 2 linux 定时任务命令 crontab -e 和 /etc/crontab 区别

回答 1 linux 定时任务命令 crontab -e 是用户级定时任务,/etc/crontab 是系统全局任务,全局文件多一列执行用户字段。

问题 3 linux 定时任务命令为什么脚本手动可以跑,crontab 里面不执行

回答 1 linux 定时任务命令 crontab 运行环境变量和终端不一样,PATH 环境变量不全,脚本里面命令尽量使用绝对路径,并且把错误输出重定向保存日志排查。

问题 4 linux 定时任务命令 at 和 crontab 有什么区别

回答 1 linux 定时任务命令 at 是一次性定时任务,到点只运行一次;crontab 是周期性循环定时任务,反复按计划执行。

【免责申明】

本文 linux 定时任务命令基于 Vixie cron 标准实现编写,不同发行版 cron 服务名称、日志路径存在差异,执行 man crontab 查看本机手册,生产环境定时脚本做好日志记录与权限管控,内容仅用于 linux 运维学习参考。

今日大家都在搜的词: