跳到主内容

systemd timer 定时任务教程:从单元文件到可靠运维

使用 service 与 timer 单元构建可审计的 Linux 定时任务,讲清 OnCalendar、Persistent、随机延后、启停检查和失败排查。

GSProber · 主机测评编辑0 阅读
使用 service 与 timer 单元构建可审计的 Linux 定时任务,讲清 OnCalendar、Persis…

systemd timer 定时任务教程:把脚本变成可管理服务

这篇 systemd timer 定时任务教程展示如何把一次性脚本拆成 service 与 timer 两个单元。相比把所有信息塞进一行计划表达式,systemd 可以统一管理运行身份、依赖关系、日志、资源限制和失败状态。下面以每日执行备份脚本为例,所有命令都应先在非生产环境验证,并按你的目录和权限调整。开始前可参考站内的Linux 安全基线,确保脚本、凭据与输出目录只有必要账号可访问。

准备脚本与 service 单元

先把任务脚本放在固定路径,例如 /usr/local/sbin/site-backup.sh,由 root 所有且不可被普通用户修改。脚本要设置明确的退出码,对输入参数进行检查,并把临时文件写入受控目录。不要在单元文件中直接写入访问密钥;应使用权限受限的环境文件或专用凭据机制。

创建 /etc/systemd/system/site-backup.service

INI
[Unit]
Description=Create site backup archive
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
User=backup
Group=backup
ExecStart=/usr/local/sbin/site-backup.sh
PrivateTmp=true
NoNewPrivileges=true

Type=oneshot 适合执行完成后退出的任务。UserGroup 用于限制权限,PrivateTmp 提供隔离的临时目录,NoNewPrivileges 防止进程获得新的特权。先执行 systemctl daemon-reload,再手动运行 systemctl start site-backup.service。只有手动执行成功后,才继续配置计时器。使用 systemctl status site-backup.servicejournalctl -u site-backup.service 查看状态与日志。

创建 timer 单元

创建 /etc/systemd/system/site-backup.timer

INI
[Unit]
Description=Run site backup every day

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=10m
Unit=site-backup.service

[Install]
WantedBy=timers.target

OnCalendar 使用 systemd 的日历事件语法。示例表示每天在系统本地时间的指定时刻触发。Persistent=true 会记录上次触发信息;如果机器在计划时刻关闭,重新启动后会补充一次错过的任务。RandomizedDelaySec 在基准时间后加入随机延后,适合避免许多服务器同时请求同一存储或接口。对于必须精确开始的任务,应根据业务目标决定是否移除随机延后。

启用并立即启动计时器:

Bash
systemctl daemon-reload
systemctl enable --now site-backup.timer
systemctl list-timers --all

list-timers 会显示下一次与上一次触发信息。还可以用 systemd-analyze calendar '*-*-* 03:15:00' 检查表达式未来的触发时刻,避免星期、时区或日期范围写错。修改单元后要重新加载配置,并重启对应 timer。

选择 OnCalendar 还是单调计时器

日历计时器适合“每天凌晨”或“每周一”这类墙上时钟语义。OnBootSecOnActiveSecOnUnitActiveSec 属于单调计时器,更适合“启动后若干时间”或“上次运行后间隔一段时间”的任务。单调时间通常不会因系统时钟校正而出现意外跳转,但不同指令的起算点并不相同,配置前应查阅官方 timer 手册。

如果任务执行时间可能超过触发间隔,service 是否仍处于活动状态会影响下一次启动。耗时任务应加入锁、幂等处理或队列,防止多个进程同时操作相同数据。需要自动恢复常驻进程时,应采用服务重启策略而非 timer,相关区别可查看站内的systemd 服务自动重启教程

验证、排错与上线清单

上线前至少验证四件事:手动启动 service 成功;timer 的下一次触发符合预期;任务账号能够读写必要目录;失败时日志和告警能够被发现。常见排查顺序是查看 systemctl status,再查看对应单元日志,然后确认脚本退出码、文件权限、工作目录和环境变量。systemd 默认不会读取交互式 shell 的完整环境,因此脚本应使用绝对路径。

停用任务时执行 systemctl disable --now site-backup.timer,这会停止并取消开机启用计时器,但不会删除单元文件。删除前先确认没有依赖关系,再移除文件并重新加载配置。通过 service 承担执行、timer 承担触发、日志承担审计,定时任务就能成为可检查、可回滚的运维组件。

教程平时玩 VPS、AI 服务器、Docker 或者折腾各种网络环境时,经常会遇到各种问题,比如想查 IP 信息、测试网络…

GSVPS 实用工具导航:20 个值得收藏的第三方工具推荐,服务器、AI 和开发用户必备

平时玩 VPS、AI 服务器、Docker 或者折腾各种网络环境时,经常会遇到各种问题,比如想查 IP 信息、测试网络、检测 DNS、查看 BGP 路由、部署模型等等。很多时候,并不需要自己搭建工具,其实网上已经有不少非常优秀的免费服务。

308 阅读

教程GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebR…

Cloudflare Workers 免费搭建开源远程桌面完整教程:无需 VPS,支持 WebRTC P2P、D1、KV、R2、浏览器远程控制、Windows 客户端和文件传输

GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebRTC P2P 直连,服务端仅负责 API、身份认证和 WebSocket 信令,不中转桌面视频流,大幅降低服务器带宽成本。项目支持 Cloudflare 免费套餐 部署,也可以使用 Docker 在 VPS 上自托管,内置 Windows 客户端、浏览器控制端、手机远程控制,支持 8 位设备 ID、OTP 一次性密码、永久密码、Ed25519 设备认证、JWT 身份验证、文件传输、剪贴板同步、自动重连 等完整功能。

311 阅读

教程如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare…

CloudDisk:基于 Cloudflare Workers 的免费个人网盘,无需 VPS、MySQL,支持 R2+D1+KV 一键部署

如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare Workers 的开源项目 CloudDisk 值得看看。整个系统运行在 Cloudflare 免费套餐上,文件存储使用 R2,数据库使用 D1,会话数据使用 KV,不需要 MySQL,也不需要服务器。支持多用户登录、文件夹管理、分享链接、在线预览、Office 文档查看、文本在线编辑、大文件断点续传、协作者权限管理等功能。无论是个人备份、开发者存放代码文件、团队共享资料,还是搭建自己的私有网盘,都可以直接部署到 Cloudflare,一键完成,几乎零维护成本,非常适合独立开发者、个人站长和轻量团队使用。

289 阅读

常见问题

修改 timer 文件后为什么没有生效?

修改单元文件后先运行 systemctl daemon-reload,再重启对应 timer,并用 systemctl list-timers --all 核对下一次触发信息。

Persistent=true 有什么作用?

它让日历计时器记录触发状态。设备在计划时刻关闭并在之后启动时,系统可以补充触发一次错过的任务;具体行为仍应结合单元状态验证。

如何查看定时任务失败原因?

先查看 service 与 timer 的 systemctl status,再用 journalctl -u 指定 service 单元检查日志,同时核对脚本退出码、权限、绝对路径和运行账号环境。

评价与回复

无需登录;审核通过后公开显示。