目录
[一、Systemd 定时任务基础](#一、Systemd 定时任务基础)
[1. 核心组件](#1. 核心组件)
[2. 关键优势](#2. 关键优势)
[1. 创建服务单元文件](#1. 创建服务单元文件)
[2. 创建定时器单元文件](#2. 创建定时器单元文件)
[3. 启用并启动定时器](#3. 启用并启动定时器)
[4. 验证任务状态](#4. 验证任务状态)
[1. 灵活的时间表达式](#1. 灵活的时间表达式)
[2. 随机延迟与资源控制](#2. 随机延迟与资源控制)
[3. 条件触发](#3. 条件触发)
[1. 日志轮转定时任务](#1. 日志轮转定时任务)
[2. 监控任务执行耗时](#2. 监控任务执行耗时)
[1. 定时器未触发](#1. 定时器未触发)
[2. 任务未执行](#2. 任务未执行)
[3. 配置语法错误](#3. 配置语法错误)
[六、与 Cron 对比](#六、与 Cron 对比)
以下是 Systemd 定时任务配置指南,涵盖基础配置、高级功能及实战案例,助你高效管理周期性任务。
一、Systemd 定时任务基础
1. 核心组件
-
服务单元(
.service
):定义要执行的任务(如运行脚本)。 -
定时器单元(
.timer
):定义触发时间规则,关联对应服务。
2. 关键优势
-
精确控制 :支持秒级触发 (
OnCalendar=*-*-* *:*:00
)。 -
依赖管理:可设置任务在系统启动后、网络就绪等条件触发。
-
日志集成 :通过
journalctl
统一查看任务日志,无需额外配置。
二、配置步骤(以每日备份为例)
1. 创建服务单元文件
sudo vim /etc/systemd/system/backup.service
内容示例:
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot # 任务执行后退出
ExecStart=/usr/bin/rsync -av /data /backup
User=backupuser # 指定执行用户
2. 创建定时器单元文件
sudo vim /etc/systemd/system/backup.timer
内容示例:
[Unit]
Description=Run backup daily at 3:30 AM
[Timer]
OnCalendar=*-*-* 03:30:00 # 每天凌晨3:30触发
Persistent=true # 错过执行后补运行
Unit=backup.service # 关联的服务
[Install]
WantedBy=timers.target # 启用目标
3. 启用并启动定时器
sudo systemctl daemon-reload # 重载配置
sudo systemctl enable backup.timer # 开机自启
sudo systemctl start backup.timer # 立即启动
4. 验证任务状态
systemctl list-timers # 查看所有定时器
journalctl -u backup.service # 查看任务执行日志
三、高级配置选项
1. 灵活的时间表达式
表达式示例 | 含义 |
---|---|
OnCalendar=Mon..Fri 09:00 |
每周一至周五9点触发 |
OnBootSec=5min |
系统启动后5分钟执行 |
OnUnitActiveSec=1h |
上次任务完成后1小时再次触发 |
AccuracySec=10m |
时间精度窗口(减少频繁触发) |
2. 随机延迟与资源控制
[Timer]
RandomizedDelaySec=30m # 随机延迟最多30分钟,避免任务重叠
CPUShares=512 # 限制CPU资源占用
MemoryLimit=512M # 限制内存使用
3. 条件触发
[Timer]
ConditionCalendar=2025-08-23 # 仅在指定日期触发
Requires=network-online.target # 依赖网络就绪
四、实战案例:日志轮转与监控
1. 日志轮转定时任务
# /etc/systemd/system/logrotate.timer
[Timer]
OnCalendar=*-*-* 03:00:00
Unit=logrotate.service
# /etc/systemd/system/logrotate.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
2. 监控任务执行耗时
systemd-analyze blame | grep logrotate # 分析任务耗时
五、常见问题排查
1. 定时器未触发
-
检查状态 :
systemctl is-active backup.timer
-
查看依赖 :
systemctl list-dependencies backup.timer
-
验证时间 :
timedatectl status
确认系统时间正确
2. 任务未执行
-
权限问题 :确保服务文件中
User
有执行权限。 -
日志分析 :
journalctl -u backup.service --since "10 minutes ago"
3. 配置语法错误
systemd-analyze verify backup.timer # 检查语法
六、与 Cron 对比
特性 | Systemd Timer | Cron |
---|---|---|
最小时间单位 | 秒级 | 分钟级 |
依赖管理 | 支持服务/网络依赖 | 不支持 |
日志管理 | 集成 journald | 需配置邮件或独立日志文件 |
资源控制 | 支持 CPU/内存限制 | 不支持 |
复杂时间表达式 | 支持日历事件、相对时间 | 仅固定格式 |
七、总结
通过 服务单元+定时器单元 的组合,Systemd 提供了比 Cron 更强大的定时任务管理能力。建议优先使用 Systemd 实现以下场景:
-
需要精确到秒的触发
-
依赖网络或服务就绪的任务
-
需要资源限制的周期性作业
附快速测试命令:
systemd-run --on-calendar="*:0/5" /path/to/command # 临时测试每5分钟执行