Linux 系统提供了多种定时任务管理工具,最常用的是 Cron 和 systemd Timer。以下是详细用法指南:
一、Cron:经典定时任务工具
Cron 是 Linux 中用于周期性执行任务的守护进程,通过编辑 crontab 文件配置任务。
1. 基本用法
- 编辑用户级定时任务:
1
crontab -e # 编辑当前用户的定时任务
- 查看任务列表:
1
crontab -l # 列出当前用户的定时任务
- 删除所有任务:
1
crontab -r
2. Crontab 文件格式
1 | # 格式:分钟 小时 日期 月份 星期 命令 |
字段说明:
字段 取值范围 说明 分钟 0-59 每小时的第几分钟执行 小时 0-23 每天的第几小时执行 日期 1-31 每月的第几天执行 月份 1-12 每年的第几月执行 星期 0-7 (0和7均为周日) 每周的周几执行 特殊符号:
*:匹配所有值。,:指定多个值(如1,3,5)。-:指定范围(如1-5)。/:间隔频率(如*/5表示每5分钟)。
3. 示例
1 | # 每天凌晨2点执行脚本 |
4. 系统级定时任务
- 文件位置:
/etc/crontab:系统全局任务(需指定用户)。/etc/cron.d/:存放自定义任务文件。/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/:按周期执行的脚本目录。
5. 日志与调试
- 查看 Cron 日志:
1
2grep CRON /var/log/syslog # Debian/Ubuntu
grep CRON /var/log/cron # RedHat/CentOS
二、Anacron:适用于非24小时运行的系统
Anacron 用于在系统未持续运行时执行错过周期的任务(如笔记本电脑)。
1. 配置文件
- 编辑
/etc/anacrontab:1
2# 格式:周期天数 延迟时间 任务名称 命令
1 5 daily-job /path/to/daily-script.sh
2. 运行机制
- 任务记录在
/var/spool/anacron/目录中。 - 适合每日、每周等低频任务。
三、systemd Timer:替代 Cron 的现代方案
systemd Timer 通过 .timer 和 .service 单元文件管理定时任务,适合复杂调度。
1. 创建 Service 文件
- 编写服务单元
/etc/systemd/system/my-job.service:1
2
3
4
5[Unit]
Description=My Custom Job
[Service]
ExecStart=/path/to/script.sh
2. 创建 Timer 文件
- 编写定时器单元
/etc/systemd/system/my-job.timer:1
2
3
4
5
6
7
8
9[Unit]
Description=Run my job daily
[Timer]
OnCalendar=*-*-* 02:00:00 # 每天凌晨2点
Persistent=true # 如果错过时间,开机后立即执行
[Install]
WantedBy=timers.target
3. 启用并启动 Timer
1 | systemctl daemon-reload |
4. 常用命令
- 查看 Timer 状态:
1
2systemctl list-timers
systemctl status my-job.timer
5. 时间格式(OnCalendar)
- 使用
OnCalendar表达式:1
2
3OnCalendar=Mon,Fri *-*-* 10:30:00 # 每周一和周五10:30
OnCalendar=*-*-* 00/3:00:00 # 每3小时
OnCalendar=daily # 每天00:00:00
四、Cron 与 systemd Timer 对比
| 特性 | Cron | systemd Timer |
|---|---|---|
| 依赖服务 | cron 守护进程 | systemd |
| 配置方式 | 文本文件 (crontab) |
单元文件 (.timer, .service) |
| 灵活性 | 简单定时 | 支持复杂调度和依赖关系 |
| 日志管理 | 需手动处理输出 | 集成 Journal 日志 |
| 适用场景 | 简单周期性任务 | 复杂任务或需系统集成 |
五、常见问题
任务未执行:
- 检查命令路径是否完整(使用绝对路径)。
- 检查权限(脚本是否可执行)。
- 查看日志:
journalctl -u my-job.service(systemd)或/var/log/cron(Cron)。
环境变量问题:
- Cron 默认环境与用户环境不同,建议在脚本中设置
PATH或使用完整路径。
- Cron 默认环境与用户环境不同,建议在脚本中设置
输出处理:
- 重定向输出到文件:
*/5 * * * * /path/to/command >> /var/log/command.log 2>&1 - 禁用邮件通知:
MAILTO=""。
- 重定向输出到文件:
通过上述方法,您可以灵活管理 Linux 系统中的定时任务。对于简单任务推荐使用 Cron,复杂或需系统集成的任务可选用 systemd Timer。