外观
3.2 定时触发
约 665 字
自动化日志
本页对应「三、操作步骤」的 3.2,把已跑通的脚本交给 cron 定时触发,明确执行账号、时间表达式、输出重定向与并发约束。返回上级:自动化任务。
前置条件
- 3.1 的脚本已手工执行通过,退出码与日志均符合预期。
- 已确认服务器时区与业务时区一致,并算出期望的触发时刻。
- 执行账号可以运行
crontab,且cron服务处于运行状态。 - 已确认脚本在非交互 shell 下同样可执行,
bash -c与登录 shell 的结果一致。 - 执行账号对日志目录有追加写权限,且不会因日志轮转被拒绝。
操作步骤
- 确认服务状态与时区,避免“表达式对、时间不对”:
systemctl is-active cron || systemctl is-active crond
date '+%F %T %Z %z'- 用执行账号编辑任务表,写入绝对路径与输出重定向:
crontab -e
# 每天 03:10 执行检查,标准输出与错误一并追加到日志
10 3 * * * /bin/bash /srv/axis/bin/check.sh >>/srv/axis/logs/cron.log 2>&1- 回读任务表,确认条目完整、没有多余空格与拼写错误:
crontab -l | grep -n "check.sh"- 用一个近时间点做一次触发验证,例如临时改成每分钟一次,验证后立即改回:
crontab -l | sed 's#^10 3 \* \* \*#* * * * *#' | crontab -
sleep 70 && tail -n 5 /srv/axis/logs/check.log结果确认
crontab -l输出的表达式与期望时刻一致,命令为绝对路径,重定向未遗漏。- 触发后日志新增一行带当前时间戳的
START check,说明任务确实被执行。 - 临时改为每分钟触发后,两次执行之间没有出现锁冲突报错。
- 任务表只包含本次需要的条目,未覆盖他人已有任务。
注意事项
cron不加载登录 shell 的环境变量,脚本里必须显式设置PATH与所需变量。- 用
crontab -e而不是直接覆盖整个任务表,覆盖会删除同账号下的其他任务。 - 高频验证完成后立刻改回原表达式,避免测试任务长期运行产生噪音日志。
- 任务之间若有依赖,用时间间隔或前置检查保证顺序,
cron本身不保证先后。 - 服务器迁移或重建后,
crontab不会随代码仓库自动恢复,任务清单要单独记录在运维文档中。 - 表达式中的
%在部分实现里会被当作换行,需要在脚本内处理,不要直接写在命令行里。