linux中创建systemd timer定时任务需配对定义同名.service和.timer单元:先写.service描述执行命令(type=oneshot等),再写.timer设置触发时间(如oncalendar=daily),最后daemon-reload并enable--now启用,支持日志追踪与依赖管理。

在 Linux 中创建 systemd Timer 定时任务,本质是配对定义一个 .service 单元和一个同名的 .timer 单元,由 systemd 负责按计划触发服务执行。它比传统 cron 更灵活(支持日志追踪、依赖管理、启动条件等),也更符合现代 systemd 生态。
1. 编写对应的 .service 文件
Timer 本身不执行任务,只负责“喊醒”服务。所以第一步是写一个标准 service 文件,描述要运行什么命令。
例如,创建 /etc/systemd/system/backup-data.service:
[Unit] Description=Daily backup of /data After=network.target <p>[Service] Type=oneshot ExecStart=/usr/local/bin/backup-script.sh User=root WorkingDirectory=/root</p>
注意点:
- Type=oneshot 表示任务执行完就退出(适合脚本类定时任务)
- User 和 WorkingDirectory 按需设置,避免权限或路径问题
- 确保
ExecStart指向的脚本存在、可执行(chmod +x),且无交互式输入
2. 编写同名的 .timer 文件
新建 /etc/systemd/system/backup-data.timer:
[Unit] Description=Run backup-data daily at 02:00 <p>[Timer] OnCalendar=<em>-</em>-* 02:00:00 Persistent=true</p><h1>可选:若上次错过时间(如系统关机),开机后立即补执行</h1><p>[Install] WantedBy=timers.target</p>
常用时间表达方式:
-
Hourly:每小时整点 →OnCalendar=hourly -
Daily:每天凌晨 →OnCalendar=daily(等价于*-*-* 00:00:00) - 自定义时间:
OnCalendar=Mon,Wed,Fri *-*-1,15 03:00:00(每月 1 日、15 日且是周一/三/五的凌晨 3 点) - 相对延迟:
OnBootSec=10min(开机后 10 分钟执行一次)或OnUnitActiveSec=1h(上次激活后 1 小时再执行)
3. 启用并启动 timer
完成两个文件后,重新加载配置并启用 timer:
sudo systemctl daemon-reload sudo systemctl enable --now backup-data.timer
验证是否生效:
-
systemctl list-timers --all→ 查看所有 timer 状态和下次触发时间 -
systemctl status backup-data.timer→ 查看 timer 运行状态 -
systemctl status backup-data.service→ 查看服务最近一次执行结果 -
journalctl -u backup-data.service -n 20→ 查看服务输出日志
4. 调试与常见问题
如果 timer 没触发,优先检查:
- 文件名是否严格匹配(
xxx.service和xxx.timer,不能有下划线/中划线混用) - 是否执行了
daemon-reload;enable是开机自启,--now才会立即启动 -
OnCalendar时间格式是否合法(用systemd-analyze calendar "your-expression"验证) - 服务执行失败时,默认不会重试 —— 如需容错,可在
[Service]中加Restart=on-failure和RestartSec=10











