用 systemd timer 替代 cron:Linux 定时任务入门实践
很多人在 Linux 上做定时任务的第一反应是 crontab。cron 简单好用,但在需要查看日志、处理依赖、补跑错过的任务时就显得力不从心。现代发行版普遍使用 systemd,它自带的 timer 单元可以完整替代 cron,而且更好排查问题。本文用一个“每天备份目录”的小例子带你上手。
一、准备要执行的脚本
先写一个最简单的备份脚本 /usr/local/bin/backup.sh:
#!/bin/bash
tar -czf /var/backups/home-$(date +%F).tar.gz /home/demo
记得执行 chmod +x /usr/local/bin/backup.sh 赋予执行权限。
二、编写 service 单元
在 /etc/systemd/system/backup.service 中写入:
[Unit]
Description=Daily home backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Type=oneshot 表示这是一个执行完就退出的任务,正适合定时脚本。
三、编写 timer 单元
timer 文件名要和 service 同名,这里是 /etc/systemd/system/backup.timer:
[Unit]
Description=Run backup every day
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
几个关键参数:OnCalendar 指定触发时间,格式比 cron 更易读;Persistent=true 表示如果机器在 2:30 时关机,开机后会补跑一次,这是 cron 做不到的;RandomizedDelaySec 可以在多台机器上错开执行,避免同时打满存储。
四、启用并验证
systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers backup.timer
list-timers 会显示下一次和上一次执行时间。想立刻测试一次,可以直接运行 systemctl start backup.service。
五、查看日志
这是 timer 相比 cron 最大的优势。所有输出都进入 journal:
journalctl -u backup.service --since today
脚本报错、退出码、执行耗时一目了然,不用再自己重定向输出到日志文件。
六、校验时间表达式
不确定 OnCalendar 写得对不对时,用 systemd-analyze calendar "*-*-* 02:30:00" 就能看到解析结果和下次触发时间,避免写错后白等一天。
小结
cron 适合快速写一行命令;而需要补跑、日志、资源控制的任务,systemd timer 是更稳妥的选择。从一个备份脚本开始,把手头的 crontab 逐步迁移过去,你会发现排查定时任务变得轻松很多。
- 点赞
- 收藏
- 关注作者
评论(0)