Shell脚本自动化运维实战技巧

前言 Shell 脚本是运维工程师最常用的自动化工具。本文记录几个实战中常用的脚本模式。 日志定期清理 服务器日志堆积是常见问题,以下脚本按保留天数自动清理: #!/bin/bash # clean_logs.sh - 日志清理脚本 LOG_DIR="/var/log/app" KEEP_DAYS=30 find "$LOG_DIR" -name "*.log" -type f -mtime +${KEEP_DAYS} -exec gzip {} \; find "$LOG_DIR" -name "*.gz" -type f -mtime +${KEEP_DAYS} -delete echo "$(date): 日志清理完成,保留 ${KEEP_DAYS} 天" 配合 crontab 每天执行: 0 2 * * * /opt/scripts/clean_logs.sh >> /var/log/clean_logs.log 2>&1 批量主机健康检查 通过 SSH 批量检查多台服务器状态: #!/bin/bash # health_check.sh - 批量健康检查 HOSTS=("web-01" "web-02" "db-01" "cache-01") THRESHOLD=80 for host in "${HOSTS[@]}"; do echo "--- ${host} ---" ssh "$host" " echo \"CPU: \$(top -bn1 | grep 'Cpu' | awk '{print \$2}')%\" echo \"MEM: \$(free | awk '/Mem/{printf \"%....

January 11, 2024 · 2 分钟 · 246 字 · 徐保金

Bash 生产级脚本编写指南

概述 Bash 是运维世界使用最广泛的脚本语言——几乎每台 Linux 服务器都自带解释器,无需安装任何运行时。但 Bash 也是最容易写出"能跑但不能信赖"脚本的语言:没有类型检查、错误默认静默、变量不加引号就分词、管道中的失败被吞掉。一个线上故障的根因往往就是某个 Bash 脚本没做错误处理。本文逐步梳理生产级 Bash 脚本的编写规范,让你写出的脚本不只是"能跑",而是"可信赖"。 参考来源:Google Shell Style Guide、ShellCheck 一、脚本骨架:set -euo pipefail 1.1 三行头 每个生产级 Bash 脚本的开头应该是这样的: #!/usr/bin/env bash set -euo pipefail 这三行做的事情: 选项 作用 不加的后果 -e (errexit) 命令失败时立即退出 错误被忽略,脚本继续执行,可能导致灾难性后果 -u (nounset) 使用未定义变量时报错 拼写错误的变量名静默返回空字符串 -o pipefail 管道中任一命令失败则整体失败 管道中前面的命令失败被忽略,只看最后一个命令的退出码 一个经典反面案例: #!/bin/bash # 没有任何安全设置 cd /nonexistent/directory # 失败,但脚本继续 rm -rf * # 在当前目录执行了!灾难 加上 set -euo pipefail 后: #!/usr/bin/env bash set -euo pipefail cd /nonexistent/directory # 失败,脚本立即退出 rm -rf * # 永远不会执行到这里 1....

December 27, 2023 · 17 分钟 · 3539 字 · 徐保金