你可以将 systemd timer 看作是“定时服务”,它可以在特定时间或按周期性地触发一个 systemd 服务(.service 单元)。

目前已经有不少的Linux服务已经使用systemd timer来管理定时任务,如下是我本地测试机的截图。

一、systemd timer 的基本使用方法

systemd timer 由两个单元文件组成:

  1. .timer 文件:定义何时以及如何触发任务。
  2. .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 的优势

相比传统 cronsystemd 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。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐