Shell脚本中无原生down指令,夜间降级实为通过systemctl、curl、kubectl等命令编排的分级可控操作,涵盖功能、容量、依赖、数据四类降级,并需可逆验证与闭环管控。

Shell 脚本中并不存在原生的 down 指令。所谓“利用 down 指令实现夜间降级”,实际是运维人员对服务停用、流量切换、资源限缩等操作的通俗说法,本质是通过标准 Shell 命令(如 systemctl stop、curl 调用降级 API、iptables 限流、kubectl scale 缩容等)配合脚本逻辑,在低峰期安全、可控地降低系统负载或功能等级。
明确“降级”具体动作,避免笼统叫法
夜间降级不是“把服务关了就行”,而是按业务 SLA 分级执行:
-
功能降级:关闭非核心接口(如评论、分享、推荐),保留登录、下单、支付主链路;可通过配置中心下发开关,或调用内部降级 API(如
curl -X POST http://cfg-svc/switch?feature=comment&state=off) -
容量降级:缩容 Pod 或进程数(如
kubectl scale deploy api-svc --replicas=2),或限制 Java 应用堆内存(修改JVM_OPTS后重启) - 依赖降级:切断或 mock 外部强依赖(如短信网关、第三方风控),改走本地缓存或默认策略
- 数据降级:关闭实时统计、日志采样率调至 10%,或切换到只读从库
用 Shell 脚本编排降级流程,强调可逆与校验
一个健壮的夜间降级脚本需包含前置检查、执行、验证、回滚入口。示例结构:
#!/bin/bash # night-downgrade.sh APP=order-svc TIME_SLOT="02:00-04:00" <h1>1. 检查是否在窗口期 & 无告警</h1><p>if [[ $(date +%H:%M) < "02:00" || $(date +%H:%M) > "04:00" ]]; then echo "Not in maintenance window"; exit 1 fi if curl -s <a href="https://www.php.cn/link/c5c121def1dce8ad63c3d8802fb2b6e7">https://www.php.cn/link/c5c121def1dce8ad63c3d8802fb2b6e7</a> | jq -e '.count > 0'; then echo "Active alerts exist, abort"; exit 1 fi</p><h1>2. 执行降级(顺序很重要)</h1><p>curl -X POST <a href="https://www.php.cn/link/6953031d270d848c22b38dd16e4c1bdb">https://www.php.cn/link/6953031d270d848c22b38dd16e4c1bdb</a> kubectl scale deploy $APP --replicas=1 systemctl reload nginx # 切换 upstream 配置,屏蔽部分 upstream server</p><h1>3. 验证关键指标</h1><p>sleep 10 if ! curl -sf <a href="https://www.php.cn/link/72321155cd8e47d3bb0f0801f5024f9f">https://www.php.cn/link/72321155cd8e47d3bb0f0801f5024f9f</a> | grep '"status":"UP"'; then echo "Health check failed, rolling back..." ./night-rollback.sh # 调用独立回滚脚本 exit 1 fi echo "Downgrade applied successfully"
集成到定时与可观测体系,杜绝“黑盒执行”
脚本不能孤立运行,必须纳入运维闭环:
-
定时触发:用
cron而非at,确保每日稳定执行(如0 2 * * * /opt/bin/night-downgrade.sh >> /var/log/downgrade.log 2>&1) -
执行留痕:记录操作人(如从环境变量取
OPERATOR)、变更内容、前后状态快照(如systemctl is-active $svc、kubectl get deploy $svc -o jsonpath='{.spec.replicas}') - 结果反馈:成功后发企业微信/钉钉通知;失败时自动告警并 @oncall 工程师
- 一键回滚设计:回滚脚本应独立存在、幂等、无需人工干预参数(如从临时文件读取上一次的 replicas 数值)
安全与权限控制不可妥协
夜间脚本拥有较高权限,必须严格管控:
- 脚本文件属主设为专用运维账号(如
ops),权限设为750,禁止 world 可读 - 涉及
sudo的命令(如重启服务)需在/etc/sudoers中精确授权,禁用NOPASSWD: ALL - API 调用使用短期 Token 或 mTLS 认证,Token 存于
/run/secrets/等内存文件系统,不硬编码 - 所有网络请求加超时(
curl --max-time 5),避免卡死整个脚本
不复杂但容易忽略的是:降级不是技术动作的堆砌,而是业务语义的精准表达。每次写脚本前,先和产品、研发对齐“夜间哪些功能可以停、停多久、用户感知是什么”,再把共识翻译成可执行、可验证、可撤销的 Shell 逻辑。

















