Systemd timer 支持秒级甚至微秒级精度,且能通过 Service 单元限制资源占用,而 cron 默认仅支持分钟级精度且无原生资源限制。若业务需要秒级触发、休眠唤醒补偿或严格的资源隔离,推荐迁移至 Systemd timer;若仅需简单分钟级任务且追求极致轻量,cron 仍适用。
先说结论:Systemd timer 在精度和资源可控性上优于 cron,但配置复杂度略高。
- 适合:需要秒级精度、任务依赖管理、系统唤醒后执行或资源限制的场景。
- 重点看:Timer 单元的 AccuracySec 配置及 Service 单元的 ResourceLimit 设置。
- 别忽略:Systemd timer 必须配对.service 文件使用,且默认精度受 AccuracySec 影响。
命令速用版
若需验证当前定时任务精度或配置资源限制,可参考以下配置片段。Systemd timer 需同时编写.timer 和.service 文件。
# /etc/systemd/system/high-precision.timer
[Timer]
OnUnitActiveSec=30
AccuracySec=1s
Persistent=false
# /etc/systemd/system/high-precision.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/script.sh
MemoryMax=500M
CPUQuota=50%cron 配置仅需编辑 crontab,但无法直接设置资源限制:
# crontab -e
*/1 * * * * /usr/local/bin/script.sh为什么会这样
精度差异源于守护进程的设计机制,cron 按分钟轮询,Systemd 基于事件和更细粒度的计时器。
cron 守护进程(crond)传统上设计为每分钟检查一次任务列表,因此原生精度限制在分钟级。Systemd timer 作为 systemd 初始化系统的一部分,支持微秒(us)、毫秒(ms)、秒(s)等多种时间单位,且能结合系统状态(如休眠唤醒)触发任务。在资源占用方面,Systemd 允许在.service 文件中定义 CPU 和内存上限,而 cron 任务默认继承用户环境,需借助 flock 或 cgroups 外部工具才能实现类似限制。
分步处理
根据业务需求选择方案,若迁移至 Systemd timer,需按以下步骤配置。
1. 评估精度需求:若任务间隔小于 1 分钟,必须使用 Systemd timer。公开资料中没有看到可靠的量化数据表明 cron 可稳定支持秒级任务。
2. 编写 Service 单元:创建/etc/systemd/system/myjob.service,定义执行命令及资源限制。Type 通常设为 oneshot。
3. 编写 Timer 单元:创建/etc/systemd/system/myjob.timer,设置 OnUnitActiveSec 或 OnCalendar。关键参数 AccuracySec 需显式设置为 1s,否则 systemd 可能合并触发。
4. 启用任务:执行 systemctl daemon-reload 重载配置,随后执行 systemctl enable `--now` myjob.timer 启用并启动。
怎么验证是否生效
通过日志和状态命令确认任务触发时间及资源限制是否生效。
1. 检查定时器状态:运行 systemctl status myjob.timer,查看 Last Triggered 和 Next Triggered 时间戳,确认间隔是否符合秒级预期。
2. 查看执行日志:Systemd 任务日志集成在 journal 中,使用 journalctl -u myjob.service 查看输出。cron 日志通常位于/var/log/cron 或/var/log/syslog,需 grep 筛选。
3. 验证资源限制:在任务执行期间,使用 systemd-cgtop 或 ps 命令观察进程 CPU 和内存使用,确认是否受 Service 单元中 MemoryMax 或 CPUQuota 约束。
常见坑
配置 Systemd timer 时容易忽略精度默认值和持久化设置。
1. AccuracySec 默认值:Systemd timer 的 AccuracySec 默认通常为 1 分钟,若需秒级精度必须显式设置为 1s,否则任务可能被延迟或合并。
2. 持久化行为:Persistent=true 会在系统重启后补跑错过的任务,若业务不允许补跑(如实时数据采集),需设置为 false。
3. 环境变量差异:Systemd 服务默认环境变量较少,需在.service 文件中显式设置 Environment 或 EnvironmentFile,而 cron 可通过 MAILTO 等变量方便管理。
常见问题
Systemd timer 会比 cron 更消耗系统资源吗?
公开资料中没有看到可靠的量化数据对比两者守护进程的 baseline 资源占用。
Systemd 作为初始化系统通常已运行,额外 timer 开销较小,但配置复杂度高于 cron。
如何实现 cron 那样的邮件通知功能?
Systemd timer 没有原生支持发送邮件的功能,需借助额外配置。
可通过在.service 中配置 StandardOutput 和 StandardError 结合邮件发送脚本实现,但步骤稍多。
任务执行时间不确定会影响下一次调度吗?
Systemd timer 默认不会重复执行,若上次任务未结束,本次触发可能跳过或排队。
cron 需结合 flock 防止重复执行,而 systemd 启动服务具有幂等性,可避免进程冲突。
参考来源
1. systemd timer:取代 cron 和 at 的定时任务
2. Linux systemd 定时任务 - 咸鱼 Linux 运维
3. 怎么在 Linux 利用 Systemd-Timer 实现比 Cron 更灵活的任务
4. Linux 定时任务全解析:Cron、Systemd Timer 与 At 命令实战指南-CSDN 博客