CentOS 定时器稳定性实践
一 基础保障
systemctl status crond 查看状态,systemctl enable --now crond 确保开机自启与运行。crontab -l 定期核对任务;对关键任务建立变更记录与版本控制,避免“神秘改动”。二 编写健壮脚本与任务条目
PATH,例如:PATH=/usr/local/bin:/usr/bin:/bin。cd "$(dirname "$0")" 或使用 cd /path && cmd 确保相对路径资源可访问。#!/usr/bin/env bash),任务行使用 /bin/bash script.sh;务必重定向输出到日志:>> /var/log/xxx.log 2>&1,便于审计与告警。source /etc/profile),避免使用仅交互式 shell 才有的特性(如 alias);为脚本设置可执行权限(chmod +x)。三 并发控制与防堆积
flock -n /var/lock/backup.lock -c "/usr/local/bin/python /opt/scripts/backup.py";-n 表示获取不到锁立即失败,防止并发。sleep $((RANDOM % 300))。Restart=on-failure、RestartSec=30、StartLimitIntervalSec=600、StartLimitBurst=3 控制失败重试与上限。四 高可靠替代方案 systemd timer
OnUnitActiveSec=5min)避免堆积;Persistent=true 实现关机错过任务的补跑;输出直接进入 journal,便于 journalctl -u xxx.service -f 实时查看;支持 OnCalendar=daily|weekly|*-*-* 02:00:00 等时间语法。/etc/systemd/system/backup.service:[Unit]
Description=Backup job
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /opt/scripts/backup.py
StandardOutput=journal
StandardError=journal
/etc/systemd/system/backup.timer:[Unit]
Description=Run backup daily at 02:00
Requires=backup.service
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload && systemctl enable --now backup.timer;查看:systemctl list-timers --all、journalctl -u backup.service -n 50 -f。五 监控告警与快速排查
systemctl status crond 确认服务存活;2) crontab -l 核对任务是否存在;3) tail -n50 /var/log/cron 或 journalctl -u crond 查执行记录;4) 检查脚本可执行权限与日志路径可写;5) 校验系统时间与时区;6) 手动执行脚本复现问题。