systemd timer定时任务 —— 筑梦之路
背景说明 定时任务执行失败但日志找不到、告警收不到 服务器重启后crontab任务“神秘消失” 想让任务“上次没跑完这次就别启动”结果自己写了一堆锁文件逻辑systemd timer无需安装任何软件无需依赖外部服务原生支持日志、依赖、状态、持久化、防并发。对比crontab能力crontabsystemd timer日志集成需手动重定向到文件自动写入 journald支持 journalctl 查询任务状态无状态失败静默可查 ActiveState、ExecMainStatus防并发执行需自行加锁默认单实例天然防重入开机补执行不支持Persistenttrue 自动补跑依赖控制无可依赖其他服务如网络、数据库资源限制无支持 MemoryLimit、CPUQuota 等因此对于单机、重要、需可观测性的定时任务systemd timer 是 crontab 的完美替代。实践操作案例场景每 5 分钟清理 /tmp 下 1 小时前的 .tmp 文件操作步骤1. 创建服务单元定义“做什么”创建文件/etc/systemd/system/clean-tmp.service[Unit] DescriptionClean old temporary files Afternetwork.target [Service] Typeoneshot ExecStart/usr/bin/find /tmp -name *.tmp -mmin 60 -delete StandardOutputjournal StandardErrorjournal ✅ 说明 Typeoneshot任务执行完即退出适合脚本 StandardOutputjournal输出自动进入系统日志2. 创建定时器单元定义“何时做”创建文件/etc/systemd/system/clean-tmp.timer[Unit] DescriptionRun clean-tmp every 5 minutes Requiresclean-tmp.service [Timer] OnBootSec1min # 开机 1 分钟后首次执行 OnUnitActiveSec5min # 上次执行完成后5 分钟再执行 Persistenttrue # 开机时若错过执行时间自动补跑 [Install] WantedBytimers.target ✅ 关键参数 OnUnitActiveSec基于上次任务完成时间触发防堆积 Persistenttrue即使关机开机后也会补执行类似 cron 的 anacron3. 启用并启动# 重载 systemd 配置 sudo systemctl daemon-reload # 启用 timer开机自启 sudo systemctl enable clean-tmp.timer # 立即启动 timer sudo systemctl start clean-tmp.timer查看执行状态与日志1. 查看 timer 状态systemctl status clean-tmp.timer 输出示例 ● clean-tmp.timer - Run clean-tmp every 5 minutes Loaded: loaded (/etc/systemd/system/clean-tmp.timer; enabled; preset: enabled) Active: active (waiting) since Mon 2025-11-01 10:00:00 CST; 3min ago Trigger: Mon 2025-11-01 10:05:00 CST; 1min 23s left2. 查看任务执行日志# 查看最近一次执行日志 journalctl -u clean-tmp.service -n 20 # 实时跟踪 journalctl -u clean-tmp.service -f列出所有执行记录含成功/失败systemctl list-timers --all | grep clean-tmp其他案例场景 1每天凌晨 2 点执行类似 cron[Timer] OnCalendar*-*-* 02:00:00 Persistenttrue OnCalendar 支持类似 cron 的语法也支持自然语言 daily weekly Mon..Fri *:00工作日每小时场景 2任务失败自动重试最多 3 次在 clean-tmp.service 中添加 [Service] Restarton-failure RestartSec30 StartLimitIntervalSec600 StartLimitBurst3场景 3限制资源使用防脚本失控[Service] MemoryLimit512M CPUQuota50%避坑误区正确做法直接编辑 /etc/systemd/system/ 后不 daemon-reload修改后必须执行systemctl daemon-reload用 OnActiveSec 代替 OnUnitActiveSecOnActiveSec 是从 timer 启动开始计时不防任务堆积忽略 Typeoneshot长期运行任务用 Typesimple脚本类必须用 oneshot日志看不到输出确保设置StandardOutputjournalcrontab vs systemd timer 迁移对照表crontab 写法systemd timer 实现*/5 * * * * /script.shOnUnitActiveSec5min0 2 * * * /backup.shOnCalendar--* 02:00:00需要 MAILTO 告警用 journalctl 日志采集 告警系统任务锁flock无需systemd 天然单实例何时该用 systemd timer✅ 推荐使用场景系统维护任务日志清理、证书更新本地数据同步/备份需要状态追踪和失败重试的关键脚本❌ 不推荐场景分布式任务用 K8s CronJob跨服务器协调用 Temporal/Airflow非 Linux 系统如 macOS、旧版 CentOS 6升级你的定时任务从淘汰 crontab 开始。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →