外观
3.1 脚本编写
约 733 字
自动化任务
本页对应「三、操作步骤」的 3.1,完成一个可手工执行、可重复执行、带退出码与日志的检查脚本,并先在终端验证通过。返回上级:自动化任务。
前置条件
- 已在服务器上创建专用账号,并具备
/srv/axis/bin与/srv/axis/logs的读写权限。 - 脚本依赖的命令已安装:
curl、date、flock、awk。 - 明确脚本要做的一件事,例如“探测站点状态码并记录耗时”,不要在一个脚本里塞入多件无关操作。
- 已确认脚本操作的目标路径与实际部署路径一致,避免在测试目录里跑通、到生产路径失效。
- 已准备可回滚的备份目录,脚本涉及覆盖或删除时必须先备份。
操作步骤
- 创建脚本目录与空脚本,统一文件权限:
mkdir -p /srv/axis/bin /srv/axis/logs
touch /srv/axis/bin/check.sh
chmod 750 /srv/axis/bin/check.sh- 写入脚本内容:设置严格模式、固定工作目录、定义日志函数与唯一锁文件:
#!/usr/bin/env bash
set -euo pipefail
export PATH=/usr/local/bin:/usr/bin:/bin
export LANG=C
BASE="/srv/axis"
LOG="$BASE/logs/check.log"
LOCK="/tmp/check.lock"
log() { printf '%s %s\n' "$(date '+%F %T')" "$*" >>"$LOG"; }
exec 9>"$LOCK"
flock -n 9 || { echo "another run in progress"; exit 0; }
log "START check"
code=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 10 "https://cdn.example.com/")
log "http_code=$code"
if [ "$code" != "200" ]; then log "FAIL unexpected code"; exit 1; fi
log "END check ok"- 手工执行并检查退出码与日志:
bash /srv/axis/bin/check.sh; echo "exit=$?"
tail -n 5 /srv/axis/logs/check.log- 连续执行两次,确认第二次不会重复写入结果,验证锁与幂等逻辑。
结果确认
- 首次执行退出码为 0,日志中出现
START check、http_code=200、END check ok三行。 - 把测试 URL 改成必然失败的地址后,退出码为 1,日志出现
FAIL unexpected code。 - 并发执行时,第二个进程输出
another run in progress并退出 0,未写入重复记录。 - 脚本内所有路径为绝对路径,
grep -n "/srv/axis" check.sh能定位到每一处。
注意事项
set -euo pipefail会让未定义变量与管道失败直接中断,调试阶段如需宽容处理应显式判断,而不是去掉这三项。- 不要在脚本里写明文口令或密钥,凭据通过环境文件读取,且环境文件权限设为 600。
- 日志要包含时间戳与结果,只记录“执行完成”无法判断成败。
- 脚本里的外部命令写绝对路径并检查退出码,管道中某一段失败时
pipefail才会让整条命令失败。 - 重试逻辑只包裹可能瞬时失败的网络请求,重试前加短暂等待,直接连发三次只会把偶发故障变成持续故障。
- 脚本改动后先在测试目录跑一遍,确认清理逻辑没有误删生产文件,再加入定时任务。