banner
约 1,200 字
4 分钟

systemd timer 教程:比 cron 更可靠的定时任务

摘要

systemd timer 是 cron 的现代替代品:错过的任务开机自动补跑,日志直接进 journalctl。本教程依据 systemd 官方文档,介绍 service+timer 成对写法、OnCalendar 日历表达式、list-timers 查看计划、systemd-analyze 验证,以及与 cron 的选型对比。

systemd timer 定时任务教程:cron 的现代替代品

cron 是经典,但它不会在服务器关机期间补跑错过的任务,日志也要去翻。systemd timer 是 systemd 原生的定时任务方案:错过的任务开机自动补跑、日志直接进 journalctl、依赖管理一体化。本教程依据 systemd 官方文档整理。

一、一个 timer 由两个文件组成

以"每天凌晨 2 点备份数据库"为例,在 /etc/systemd/system/ 下建两个文件。

backup.service(做什么):

ini
[Unit]
Description=Backup database

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

backup.timer(什么时候做):

ini
[Unit]
Description=Run backup daily

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Type=oneshot 表示这是跑完就退的一次性任务;Persistent=true 就是"错过补跑"的开关——停机期间错过的任务会在下次开机后立即执行。

二、启用与查看

bash
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer   # 启用定时器
systemctl list-timers                      # 查看所有定时器及下次触发时间
systemctl list-timers backup.timer         # 只看这一个

list-timers 会显示每个任务"下次什么时候跑、上次什么时候跑",比翻 cron 日志直观得多。

三、OnCalendar 时间语法

OnCalendar 用的是日历式表达,比 cron 五字段好读:

表达式

含义

*-*-* 02:00:00

每天 02:00

*-*-* *:00/15:00

每 15 分钟

Mon..Fri *-*-* 09:00:00

工作日每天 9 点

*-*-01 00:00:00

每月 1 号零点

Sun *-*-* 03:00:00

每周日 3 点

写完可以先验证:systemd-analyze calendar "Mon..Fri 09:00" 会打印出未来几次触发时间。

四、与 cron 怎么选

对比项

cron

systemd timer

错过补跑

不支持

Persistent=true

日志

邮件/自配

journalctl 直接看

随机延迟

手写 sleep

RandomizedDelaySec=

资源限制

加 MemoryMax 等参数

上手难度

一行搞定

需要两个文件

简单的一次性小任务,cron 一行更省事;生产环境和备份类任务,timer 的补跑和日志是实打实的优势。两者共存也没问题。

五、看执行日志

bash
journalctl -u backup.service            # 任务的全部日志
journalctl -u backup.service -f         # 跟踪
journalctl -u backup.service --since today

六、总结

需求

做法

定时执行

.service + .timer 成对出现

每天几点

OnCalendar=*-*-* 02:00:00

错过补跑

Persistent=true

查看计划

systemctl list-timers

看日志

journalctl -u 任务.service

验证表达式

systemd-analyze calendar

把本站 Bash 备份脚本的 crontab 换成 timer + Persistent,服务器再怎么重启,备份也一次不落。

END