linux中systemd timer 定时器的使用
systemd timer 是现代 Linux 系统中推荐的任务调度方式,尤其适合与系统服务集成的场景。
你可以将 systemd timer 看作是“定时服务”,它可以在特定时间或按周期性地触发一个 systemd 服务(.service 单元)。
目前已经有不少的Linux服务已经使用systemd timer来管理定时任务,如下是我本地测试机的截图。

一、systemd timer 的基本使用方法
systemd timer 由两个单元文件组成:
.timer文件:定义何时以及如何触发任务。.service文件:定义实际要执行的任务。
下面以创建一个每分钟打印时间的定时任务为例演示:
1. 创建 .service 文件
代码语言:txt
AI代码解释
# /etc/systemd/system/hello-timer.service
[Unit]
Description=Hello Timer Service
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'date >> /tmp/hello-timer.log'
说明:
Type=oneshot:表示这个服务运行一次就结束。ExecStart:指定要执行的命令。
2. 创建 .timer 文件
代码语言:txt
AI代码解释
# /etc/systemd/system/hello-timer.timer
[Unit]
Description=Run Hello Timer Every Minute
Requires=hello-timer.service
[Timer]
OnCalendar=*:*:00
AccuracySec=1s
Persistent=true
[Install]
WantedBy=timers.target
说明:
OnCalendar=*:*:00:表示每分钟的第0秒触发(即每分钟一次)。AccuracySec=1s:高精度触发,避免延迟(默认是1分钟,可能延迟)。Persistent=true:即使系统在任务本该运行时处于关机状态,下次开机后会补执行(类似cron的@reboot行为扩展)。
3. 启用并启动 timer
代码语言:txt
AI代码解释
# 重新加载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
# 启用并启动 timer
sudo systemctl enable hello-timer.timer
sudo systemctl start hello-timer.timer
4. 查看状态
代码语言:txt
AI代码解释
# 查看 timer 状态
systemctl list-timers
# 或
systemctl status hello-timer.timer
# 查看日志
journalctl -u hello-timer.service -f
# 列出所有hello-timer的执行情况
systemctl list-timers --all | grep hello-timer
二、systemd timer 的优势
相比传统 cron,systemd timer 有以下显著优势:
|
特性 |
systemd timer |
cron |
|---|---|---|
|
日历语法更强大 |
支持 weekly, monthly, hourly, daily, mon,thu, 2025-*-1 *:00:00 等 |
基本支持但不够灵活 |
|
高精度控制 |
可设置 AccuracySec=1ms 到纳秒级精度 |
通常最小粒度为1分钟 |
|
持久化任务 |
Persistent=true 可在系统休眠/关机后补执行 |
不支持自动补执行 |
|
日志集成 |
自动记录到 journald,便于排查问题 |
需手动重定向日志 |
|
依赖管理 |
可设置依赖其他服务(如 After=network.target) |
无原生依赖支持 |
|
用户级定时器 |
支持用户会话级定时器(无需 root) |
需配置用户 crontab |
|
安全性 |
支持 sandboxing、权限控制等安全特性 |
权限控制较弱 |
|
状态查看 |
systemctl list-timers 提供清晰视图 |
crontab -l 仅显示配置 |
三、实用例子
示例1:每天凌晨2点备份数据库
代码语言:txt
AI代码解释
# backup-db.service
[Unit]
Description=Backup PostgreSQL Database
After=network.target
[Service]
Type=oneshot
User=postgres
ExecStart=/usr/bin/pg_dump mydb > /backups/mydb-$(date +%%Y%%m%%d).sql
代码语言:txt
AI代码解释
# backup-db.timer
[Unit]
Description=Daily Database Backup at 2:00 AM
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
示例2:每周一上午9点发送提醒邮件
代码语言:txt
AI代码解释
# weekly-reminder.service
[Unit]
Description=Send Weekly Reminder Email
[Service]
Type=oneshot
ExecStart=/usr/bin/mail -s "Weekly Reminder" user@example.com < /home/user/reminders.txt
代码语言:txt
AI代码解释
# weekly-reminder.timer
[Unit]
Description=Send Reminder Every Monday at 9 AM
[Timer]
OnCalendar=mon *-*-* 09:00:00
Persistent=true
[Install]
WantedBy=timers.target
示例3:开机后5分钟运行初始化脚本
代码语言:txt
AI代码解释
# init-script.service
[Unit]
Description=Run Initialization Script
[Service]
Type=oneshot
ExecStart=/opt/scripts/init.sh
代码语言:txt
AI代码解释
# init-script.timer
[Unit]
Description=Run Init Script 5 Minutes After Boot
[Timer]
OnBootSec=5min
# 或 OnStartupSec=5min(从 systemd 启动开始计时)
[Install]
WantedBy=timers.target
示例4:每小时执行一次同步任务(类似 cron hourly)
代码语言:txt
AI代码解释
# sync-data.timer
[Timer]
OnCalendar=hourly
AccuracySec=1s
Persistent=true
等价于 00 * * * * 的 cron 表达式,但更语义化。
其它可选参数含义说明:
1 任务失败自动重试(最多 5 次)
代码语言:txt
AI代码解释
[Service]
Restart=on-failure
RestartSec=30
StartLimitIntervalSec=600
StartLimitBurst=5
2 限制CPU和内存资源使用
代码语言:txt
AI代码解释
[Service]
MemoryLimit=128M
CPUQuota=20%
四、常用 OnCalendar 时间格式
|
写法 |
含义 |
|---|---|
|
*-*-* 03:00:00 |
每天3点整 |
|
hourly |
每小时一次 |
|
daily |
每天凌晨1:00(可配置) |
|
weekly |
每周一次 |
|
monthly |
每月一次 |
|
mon,fri *-*-* 18:00:00 |
每周一和周五晚上6点 |
|
*-01-01 00:00:00 |
每年元旦零点 |
|
Sat *-*-* 10:00:00 |
每周六上午10点 |
使用
systemd-analyze calendar "Mon *-*-* 09:00:00"可验证时间表达式是否正确。
五、总结
systemd timer 是现代 Linux 系统中推荐的任务调度方式,尤其适合与系统服务集成的场景。它的优势在于:
- 更强大的时间表达能力
- 更好的日志和状态管理
- 支持补执行、高精度、依赖控制
- 与整个
systemd生态无缝集成
虽然对于简单的用户级任务,crontab 依然方便,但在自动化、系统维护等领域,systemd timer 正在逐步取代 cron 成为主流选择。如果你正在设计新的自动化任务或者希望做基础软件的交付,涉及到定时任务的话强烈建议优先考虑使用 systemd timer。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)