定时任务不止crontab:openEuler上systemd定时器与开机补跑
服务器上的定时任务,很多管理员的顺手工具是 crontab——它确实够用,但有一个老毛病:到点没开机,任务就静默错过了。备份脚本定在凌晨两点,那天晚上恰好断电检修,这天的备份就永远缺着,除非有人记得手工补。openEuler 继承的 systemd 定时器(timer)补上了这块短板:定时任务由 systemd 统一调度,错过的时间点可以在开机后自动补跑一次。下面按 openEuler 官方文档 systemd 章节的做法,给一个备份脚本配上定时器。
第一步,写服务单元。 systemd 的定时任务由两个文件组成,先写真正干活的 service(放在 /etc/systemd/system/ 下,如 night-backup.service):
[Unit]
Description=Nightly backup job
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Type=oneshot 表示一次性执行,跑完即退,适合备份、同步、清理这类批处理。
第二步,写定时器单元。 再建 night-backup.timer:
[Unit]
Description=Run nightly backup
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar 写执行时间点,语法比 crontab 直观(本例=每天 02:00);Persistent=true 是补跑的开关——到点时若机器没开机,开机后 systemd 会补执行一次错过的任务。间隔型任务也可以用 OnUnitActiveSec=1h 这类相对时间写法。
第三步,启用定时器。 service 文件不需要 enable,被 timer 引用即可;启用的是 timer:
systemctl daemon-reload
systemctl enable --now night-backup.timer
第四步,核对与排错。 systemctl list-timers 能看到全部定时器与下一次触发时间,确认 night-backup.timer 在列、NEXT 时间正确;任务没按预期跑,先看 journalctl -u night-backup.service 的执行日志,脚本权限(可执行位)、路径(用绝对路径)是两类高频问题。时间点表达式拿不准,可用 systemd-analyze calendar "Mon..Fri 02:00" 先解析一遍,systemd 会把表达式的未来几次触发时间直接算给你看。
与 crontab 怎么选。 一次性批处理任务、需要补跑保障的备份类任务,优先 timer;简单临时任务、习惯 crontab 语法的场景继续用也无妨,两者在同一台机器上并不冲突,日志统一进 journald 反而好管。
备份缺失往往在要恢复的那一刻才被发现,代价最大。定时任务、备份校验与恢复演练是一套活儿,企业在做服务器日常运维规范时建议一并定下来。贵州诚鑫致达科技为中小企业提供 Linux 服务器的日常运维托管,从备份策略到巡检告警形成固定流程,欢迎有需要的单位联系我们了解运维方案。
(约 950 字)
企业存储选型参考|贵州诚鑫致达
小团队起步上手 NAS,群晖机型参考:DS425+ · DS224+ · DS124。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。
服务区域|贵州诚鑫致达
贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。兴义(黔西南):群晖 NAS、信创云盘与数据管理集成服务。