溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

生產環境中有哪些常用的shell腳本

發布時間:2022-02-17 15:42:32 來源:億速云 閱讀:200 作者:iii 欄目:開發技術
# 生產環境中有哪些常用的Shell腳本

## 引言

在現代IT基礎設施管理中,Shell腳本作為自動化運維的核心工具,幾乎滲透到生產環境的每個角落。根據2023年DevOps調查報告顯示,78%的企業在生產環境中使用Shell腳本實現關鍵任務的自動化。本文將深入剖析生產環境中高頻使用的Shell腳本類型,通過實際案例揭示其實現原理,并提供性能優化方案和安全實踐建議。

## 一、系統監控類腳本

### 1.1 資源監控腳本

```bash
#!/bin/bash
# 資源監控告警腳本
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90

CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
DISK_USAGE=$(df -h / | awk '{print $5}' | tail -1 | sed 's/%//')

[ $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc) -eq 1 ] && \
  echo "CPU警報: ${CPU_USAGE}%" | mail -s "CPU告警" admin@example.com

[ $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc) -eq 1 ] && \
  echo "內存警報: ${MEM_USAGE}%" | mail -s "內存告警" admin@example.com

[ $DISK_USAGE -gt $THRESHOLD_DISK ] && \
  echo "磁盤警報: ${DISK_USAGE}%" | mail -s "磁盤告警" admin@example.com

關鍵改進: - 使用bc進行浮點數比較 - 多指標綜合監控 - 郵件告警集成

1.2 進程存活監控

#!/bin/bash
# 進程守護腳本
SERVICE="nginx"
PID=$(pgrep -x "$SERVICE")

if [ -z "$PID" ]; then
    echo "$(date): $SERVICE 服務宕機,正在重啟..." >> /var/log/service_monitor.log
    systemctl start $SERVICE
    # 二次驗證
    sleep 5
    if ! pgrep -x "$SERVICE" >/dev/null; then
        echo "$(date): 重啟失敗,發送告警" >> /var/log/service_monitor.log
        mail -s "$SERVICE 服務異常" admin@example.com < /var/log/service_monitor.log
    fi
fi

增強特性: - 重啟失敗二次驗證 - 日志記錄時間戳 - 狀態變更歷史追蹤

二、日志處理類腳本

2.1 日志輪轉切割

#!/bin/bash
# 智能日志輪轉腳本
LOG_DIR="/var/log/app"
MAX_SIZE="200M"
RETENTION_DAYS=30

find $LOG_DIR -name "*.log" -type f -size +$MAX_SIZE | while read LOGFILE
do
    TIMESTAMP=$(date +%Y%m%d%H%M%S)
    gzip -c $LOGFILE > "${LOGFILE}.${TIMESTAMP}.gz"
    > $LOGFILE
done

# 過期日志清理
find $LOG_DIR -name "*.gz" -mtime +$RETENTION_DAYS -exec rm -f {} \;

優化點: - 按大小而非時間觸發輪轉 - 保留壓縮副本而非直接刪除 - 并行處理加速(GNU parallel)

2.2 日志分析報警

#!/bin/bash
# 實時錯誤日志監控
ERROR_PATTERNS=("500 Internal Server Error" "OutOfMemory" "Connection refused")

tail -F /var/log/app/error.log | while read LINE
do
  for PATTERN in "${ERROR_PATTERNS[@]}"; do
    if echo "$LINE" | grep -q "$PATTERN"; then
      echo "[$(date +'%Y-%m-%d %H:%M:%S')] 檢測到錯誤: $LINE" >> /var/log/error_monitor.log
      # 頻率限制:每分鐘最多告警一次
      [ ! -f /tmp/last_alert ] || find /tmp/last_alert -mmin +1 | grep -q . && \
        echo "緊急錯誤: $PATTERN\n完整日志: $LINE" | mail -s "應用錯誤告警" admin@example.com && \
        touch /tmp/last_alert
    fi
  done
done

高級特性: - 模式匹配數組 - 頻率限制機制 - 上下文日志記錄

三、備份恢復類腳本

3.1 數據庫熱備份

#!/bin/bash
# MySQL全量+增量備份
BACKUP_DIR="/backup/mysql"
CONFIG_FILE="/etc/mysql/backup.cnf"
DATE=$(date +%Y%m%d)
FULL_BACKUP_DAY=0 # 周日全備

[ ! -d "$BACKUP_DIR" ] && mkdir -p "$BACKUP_DIR"

if [ $(date +%w) -eq $FULL_BACKUP_DAY ]; then
    # 全量備份
    FILENAME="full-$DATE.sql.gz"
    mysqldump --defaults-file=$CONFIG_FILE --all-databases --single-transaction | gzip > $BACKUP_DIR/$FILENAME
else
    # 增量備份
    LAST_FULL=$(ls -t $BACKUP_DIR/full-* | head -1)
    FILENAME="incr-$DATE.sql.gz"
    mysqlbinlog --read-from-remote-server --raw --stop-never \
      --result-file=$BACKUP_DIR/incr/ $LAST_FULL 2>/dev/null &
    # 壓縮前一天增量
    find $BACKUP_DIR/incr/ -name "*.sql" -mtime +1 -exec gzip {} \;
fi

# 備份驗證
if [ ! -s $BACKUP_DIR/$FILENAME ]; then
    echo "備份失敗: $FILENAME" | mail -s "MySQL備份異常" admin@example.com
fi

# 清理舊備份
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete

專業實踐: - 全量+增量組合策略 - 備份文件完整性驗證 - 自動清理機制

3.2 文件系統快照

#!/bin/bash
# LVM快照備份
VOLUME_GROUP="vg_data"
LOGICAL_VOLUME="lv_app"
MOUNT_POINT="/app"
SNAPSHOT_SIZE="5G"
BACKUP_DIR="/backup/snapshots"

lvcreate -L$SNAPSHOT_SIZE -s -n ${LOGICAL_VOLUME}_snap /dev/$VOLUME_GROUP/$LOGICAL_VOLUME
mkdir -p $BACKUP_DIR/$(date +%Y%m%d)
mount /dev/$VOLUME_GROUP/${LOGICAL_VOLUME}_snap $MOUNT_POINT

rsync -aHAX --delete $MOUNT_POINT/ $BACKUP_DIR/$(date +%Y%m%d)/

umount $MOUNT_POINT
lvremove -f /dev/$VOLUME_GROUP/${LOGICAL_VOLUME}_snap

# 校驗備份完整性
if [ $(find $BACKUP_DIR/$(date +%Y%m%d) -type f | wc -l) -eq 0 ]; then
    echo "快照備份失敗" | mail -s "LVM備份異常" admin@example.com
fi

關鍵技術: - LVM寫時復制快照 - 原子性文件同步 - 資源自動釋放

四、自動化部署類腳本

4.1 藍綠部署切換

#!/bin/bash
# 零停機部署腳本
CURRENT_DEPLOY="/var/www/current"
NEW_DEPLOY="/var/www/releases/$(date +%Y%m%d%H%M%S)"
OLD_DEPLOY=""

[ -L "$CURRENT_DEPLOY" ] && OLD_DEPLOY=$(readlink "$CURRENT_DEPLOY")

# 準備新版本
rsync -az --exclude=".git" /build/ $NEW_DEPLOY/
cd $NEW_DEPLOY && npm install --production

# 測試驗證
if ! curl -Isf "http://localhost:3000/health" >/dev/null; then
    echo "新版本健康檢查失敗" >&2
    rm -rf $NEW_DEPLOY
    exit 1
fi

# 切換流量
ln -sfn $NEW_DEPLOY $CURRENT_DEPLOY
systemctl reload nginx

# 舊版本清理
[ -n "$OLD_DEPLOY" ] && nohup bash -c "sleep 3600 && rm -rf $OLD_DEPLOY" &

生產級特性: - 原子性切換 - 健康檢查機制 - 延遲清理舊版本

4.2 配置管理模板

#!/bin/bash
# 動態配置生成器
CONFIG_TEMPLATE="/templates/nginx.conf.tpl"
OUTPUT_FILE="/etc/nginx/conf.d/app.conf"

declare -A CONFIG_VARS=(
    ["WORKER_PROCESSES"]=$(nproc)
    ["KEEPALIVE_TIMEOUT"]=75
    ["CLIENT_MAX_BODY_SIZE"]="50M"
)

# 模板渲染
> $OUTPUT_FILE
while IFS= read -r LINE; do
    for VAR in "${!CONFIG_VARS[@]}"; do
        LINE=${LINE//\{\{$VAR\}\}/${CONFIG_VARS[$VAR]}}
    done
    echo "$LINE" >> $OUTPUT_FILE
done < $CONFIG_TEMPLATE

# 配置驗證
if ! nginx -t; then
    cp $OUTPUT_FILE ${OUTPUT_FILE}.error
    echo "配置生成錯誤,已保存到 ${OUTPUT_FILE}.error" >&2
    exit 1
fi
systemctl reload nginx

最佳實踐: - 變量自動填充 - 配置語法預檢 - 錯誤配置存檔

五、安全加固類腳本

5.1 入侵檢測掃描

#!/bin/bash
# 文件完整性校驗
BASE_DIR="/etc"
HASH_FILE="/var/security/baseline_hashes.md5"
ALERT_EML="security@example.com"

[ ! -d "$(dirname $HASH_FILE)" ] && mkdir -p "$(dirname $HASH_FILE)"

# 基線建立模式
if [ "$1" == "--init" ]; then
    find $BASE_DIR -type f -exec md5sum {} + > $HASH_FILE
    chmod 600 $HASH_FILE
    exit 0
fi

# 檢測模式
TEMP_FILE=$(mktemp)
find $BASE_DIR -type f -exec md5sum {} + > $TEMP_FILE

diff <(sort $HASH_FILE) <(sort $TEMP_FILE) | grep '^[<>]' > /var/security/diff_report.txt

if [ -s /var/security/diff_report.txt ]; then
    echo "發現文件變更:" | mail -a /var/security/diff_report.txt -s "文件完整性警報" $ALERT_EML
fi

rm $TEMP_FILE

安全機制: - 基線哈希校驗 - 變更差異報告 - 敏感權限控制

5.2 防火墻自動化

#!/bin/bash
# 動態防火墻管理
WHITELIST=(192.168.1.0/24 10.0.0.5)
HIGH_RISK_PORTS=(135 139 445 3389)

# 清空現有規則
iptables -F
iptables -X
iptables -Z

# 默認策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 白名單處理
for IP in "${WHITELIST[@]}"; do
    iptables -A INPUT -s $IP -j ACCEPT
done

# 基礎服務放行
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 高危端口封鎖
for PORT in "${HIGH_RISK_PORTS[@]}"; do
    iptables -A INPUT -p tcp --dport $PORT -j DROP
    iptables -A INPUT -p udp --dport $PORT -j DROP
done

# 應用規則持久化
iptables-save > /etc/iptables.rules

防御策略: - 默認拒絕原則 - 白名單機制 - 高危端口自動封鎖

六、性能優化類腳本

6.1 內核參數調優

#!/bin/bash
# 高性能內核參數配置
SYSCTL_CONF="/etc/sysctl.d/99-tuning.conf"

cat > $SYSCTL_CONF <<EOF
# 網絡棧優化
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 內存管理
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10

# 文件系統
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
EOF

sysctl -p $SYSCTL_CONF

調優重點: - TCP連接復用 - 內存換出策略 - 文件描述符限制

6.2 存儲IO優化

#!/bin/bash
# 磁盤調度策略優化
NVME_DEVICES=$(lsblk -d -o NAME,ROTA | grep '0$' | awk '{print $1}')
SSD_DEVICES=$(lsblk -d -o NAME,ROTA | grep '1$' | awk '{print $1}')

for DEV in $NVME_DEVICES; do
    echo "none" > /sys/block/$DEV/queue/scheduler
    echo "0" > /sys/block/$DEV/queue/nomerges
    echo "1024" > /sys/block/$DEV/queue/nr_requests
done

for DEV in $SSD_DEVICES; do
    echo "kyber" > /sys/block/$DEV/queue/scheduler
    echo "2" > /sys/block/$DEV/queue/nomerges
    echo "128" > /sys/block/$DEV/queue/nr_requests
done

優化策略: - NVMe設備無調度模式 - SSD自適應調度 - 請求隊列深度調整

七、跨平臺兼容腳本

7.1 多系統兼容檢測

#!/bin/bash
# 跨平臺環境檢測
OS_NAME=$(uname -s)
ARCH=$(uname -m)

case $OS_NAME in
    Linux)
        # 識別Linux發行版
        if [ -f /etc/os-release ]; then
            . /etc/os-release
            DISTRO=$ID
        elif type lsb_release >/dev/null 2>&1; then
            DISTRO=$(lsb_release -si | tr '[:upper:]' '[:lower:]')
        else
            DISTRO=$(uname -o | tr '[:upper:]' '[:lower:]')
        fi
        ;;
    Darwin)
        DISTRO="macos"
        ;;
    *)
        DISTRO="unknown"
        ;;
esac

# 架構適配
case $ARCH in
    x86_64)
        BINARY_ARCH="amd64"
        ;;
    arm*)
        BINARY_ARCH="arm"
        ;;
    aarch64)
        BINARY_ARCH="arm64"
        ;;
    *)
        BINARY_ARCH=$ARCH
        ;;
esac

echo "檢測到系統: $DISTRO $BINARY_ARCH"

兼容性處理: - 發行版自動識別 - 架構類型映射 - 環境變量標準化

八、腳本開發最佳實踐

8.1 代碼質量規范

#!/bin/bash
# 符合ShellCheck標準的腳本模板
set -o errexit    # 立即退出遇到錯誤
set -o nounset    # 使用未定義變量時報錯
set -o pipefail   # 管道命令失敗時整個命令失敗

readonly SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly LOG_FILE="/var/log/$(basename "$0").log"

function log() {
    local level=$1
    shift
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $@" | tee -a "$LOG_FILE"
}

function validate_params() {
    if [ $# -lt 2 ]; then
        log ERROR "參數不足,需要至少2個參數"
        exit 1
    fi
}

function main() {
    validate_params "$@"
    log INFO "腳本啟動,參數: $*"
    
    # 業務邏輯
    local input_file=$1
    local output_dir=$2
    
    if [ ! -f "$input_file" ]; then
        log ERROR "輸入文件不存在: $input_file"
        exit 2
    fi
    
    mkdir -p "$output_dir"
    
    log INFO "處理完成"
}

main "$@"

工程化規范: - 嚴格錯誤處理 - 日志標準化 - 參數驗證 - 函數模塊化

8.2 性能優化技巧

”`bash #!/bin/bash

高性能腳本編寫示例

set -eo pipefail

1. 避免不必要的子shell

array=(1 2 3) for i in “\({array[@]}"; do process "\)i”

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女