Cron vs Systemd Timer 定时任务对比

定时任务是 VPS 运维的基本需求 —— 自动备份、日志清理、证书续期等操作都需要定时执行。Linux 上有两种主流的定时任务方案:传统的 Cron 和现代的 Systemd Timer。本文将对比两者的差异和使用方法。购买搬瓦工使用优惠码 NODESEEK2026 享 6.77% 折扣。

一、核心对比表

对比维度CronSystemd Timer
配置方式crontab 文件.timer + .service 单元文件
时间精度最小到分钟最小到微秒
日志记录syslog 或邮件journald(结构化日志)
依赖管理不支持可依赖其他服务
错过执行跳过不补Persistent=true 可补执行
随机延迟不支持RandomizedDelaySec
资源限制不支持完整的 cgroups 限制
状态查看无直观方式systemctl list-timers
学习曲线简单中等
适用场景简单定时任务需要精细控制的任务

二、Cron 使用指南

2.1 Cron 表达式格式

# 格式:分 时 日 月 周 命令
# *    *    *    *    *
# 分   时   日   月   周
# 0-59 0-23 1-31 1-12 0-7(0和7都是周日)

# 示例
0 3 * * *     /opt/scripts/backup.sh      # 每天凌晨 3:00
*/5 * * * *   /opt/scripts/check.sh       # 每 5 分钟
0 0 * * 0     /opt/scripts/weekly.sh      # 每周日零点
0 9 1 * *     /opt/scripts/monthly.sh     # 每月 1 号 9:00
30 2 * * 1-5  /opt/scripts/workday.sh     # 工作日 2:30

2.2 管理 Cron 任务

# 编辑当前用户的 crontab
crontab -e

# 查看当前用户的 crontab
crontab -l

# 编辑指定用户的 crontab
crontab -u www-data -e

# 删除所有 crontab
crontab -r

# 实际示例:每天 3 点备份数据库
0 3 * * * mysqldump -u root mydb > /backup/db-$(date +\%Y\%m\%d).sql 2>> /var/log/backup.log

# 每小时清理临时文件
0 * * * * find /tmp -mtime +7 -delete

# 每天续期 SSL 证书
0 2 * * * certbot renew --quiet && systemctl reload nginx

三、Systemd Timer 使用指南

3.1 创建 Timer 单元

Systemd Timer 需要两个文件:一个 .timer 文件定义调度,一个 .service 文件定义任务。

# 创建服务单元:/etc/systemd/system/backup.service
[Unit]
Description=Daily Database Backup

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=root
# 创建 Timer 单元:/etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 3:00

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
# 启用并启动 Timer
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer

# 查看 Timer 状态
systemctl status backup.timer
systemctl list-timers --all

3.2 OnCalendar 时间格式

# 格式:星期 年-月-日 时:分:秒
*-*-* 03:00:00           # 每天 3:00
Mon *-*-* 09:00:00       # 每周一 9:00
*-*-01 00:00:00          # 每月 1 号零点
*-*-* *:00/5:00          # 每 5 分钟
*-*-* 09..17:00:00       # 每天 9-17 点整点

# 预定义快捷方式
daily                     # 每天零点
weekly                    # 每周一零点
monthly                   # 每月 1 号零点
hourly                    # 每小时

# 验证时间表达式
systemd-analyze calendar "*-*-* 03:00:00"
systemd-analyze calendar "Mon *-*-* 09:00:00" --iterations=5

3.3 高级功能

# 错过执行后补执行(如服务器当时关机)
[Timer]
Persistent=true

# 随机延迟(避免多个任务同时执行)
[Timer]
RandomizedDelaySec=600

# 资源限制
[Service]
MemoryMax=512M
CPUQuota=50%

# 查看任务日志
journalctl -u backup.service --since today
journalctl -u backup.service -n 20

四、适用场景

选择 Cron

  • 简单的定时脚本(备份、清理)。
  • 不需要精细的资源控制和日志管理。
  • 快速配置,不想创建多个文件。
  • 已有大量 Cron 任务需要维护。

选择 Systemd Timer

  • 需要精确到秒的调度。
  • 需要 Persistent 补执行功能。
  • 需要 journald 统一日志和 cgroups 资源限制。
  • 任务需要依赖其他系统服务。

总结

Cron 简单直接,适合大多数日常定时任务。Systemd Timer 功能更强大,适合需要精细控制的场景。在搬瓦工 VPS 上,两者可以混合使用 —— 简单任务用 Cron,复杂任务用 Systemd Timer。更多自动化工具请参考 Makefile 教程。选购搬瓦工请访问 全部方案,使用优惠码 NODESEEK2026 享 6.77% 折扣,通过 bwh81.net 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。