当前位置:首页>Linux>Linux Shell脚本:从手动部署到自动化的蜕变,让你告别加班(详细)

Linux Shell脚本:从手动部署到自动化的蜕变,让你告别加班(详细)

  • 2026-09-09 01:31:16
Linux Shell脚本:从手动部署到自动化的蜕变,让你告别加班(详细)

    在Linux系统管理中,你是否曾经遇到过重复操作繁琐、部署流程复杂、或者维护工作量大的问题?
    Shell脚本自动化是系统管理的重要技能,掌握这些技能不仅能提高工作效率,还能减少人为错误。
    本文将详细介绍Shell脚本自动化的核心技术和配置技巧。

目录

  1. 1. 脚本基础
  2. 2. 部署脚本
  3. 3. 批量管理

1. 脚本基础

1.1 基本语法

创建脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#!/bin/bash

# 创建脚本文件
cat > deploy.sh << 'EOF'
#!/bin/bash

# 脚本说明
echo "开始部署..."

# 检查系统
if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS=$NAME
    VERSION=$VERSION_ID
    echo "系统: $OS $VERSION"
else
    echo "无法检测系统版本"
    exit 1
fi
EOF

# 添加执行权限
chmod +x deploy.sh


变量定义:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#!/bin/bash

# 定义变量
APP_NAME="myapp"
APP_VERSION="1.0.0"
APP_PORT="8080"

# 使用变量
echo "应用名称: $APP_NAME"
echo "应用版本: $APP_VERSION"
echo "应用端口: $APP_PORT"

# 数组定义
servers=("web1" "web2" "web3")
echo "服务器列表: ${servers[@]}"


1.2 条件判断

if语句:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#!/bin/bash

# 基本if语句
if [ $1 -eq 1 ]; then
    echo "参数为1"
elif [ $1 -eq 2 ]; then
    echo "参数为2"
else
    echo "参数不是1或2"
fi

# 文件判断
if [ -f /etc/passwd ]; then
    echo "文件存在"
fi

if [ -d /tmp ]; then
    echo "目录存在"
fi

# 网络判断
if ping -c 1 8.8.8.8 &> /dev/null; then
    echo "网络连接正常"
else
    echo "网络连接异常"
fi


case语句:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#!/bin/bash

# case语句
case $1 in
    start)
        echo "启动服务"
        ;;
    stop)
        echo "停止服务"
        ;;
    restart)
        echo "重启服务"
        ;;
    *)
        echo "用法: $0 {start|stop|restart}"
        exit 1
        ;;
esac


1.3 循环结构

for循环:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#!/bin/bash

# 数字循环
for i in {1..5}; do
    echo "数字: $i"
done

# 文件循环
for file in *.txt; do
    echo "处理文件: $file"
    cat "$file"
done

# 数组循环
servers=("web1" "web2" "web3")
for server in "${servers[@]}"; do
    echo "服务器: $server"
done


while循环:



1
2
3
4
5
6
7
8
9
10
11
12
13

#!/bin/bash

# 基本while循环
count=1
while [ $count -le 5 ]; do
    echo "计数: $count"
    ((count++))
done

# 读取文件
while read line; do
    echo "行内容: $line"
done < /etc/passwd


2. 部署脚本

2.1 环境准备

系统检查脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#!/bin/bash

# 系统检查脚本
check_system() {
    echo "检查系统环境..."

    # 检查操作系统
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        echo "系统: $NAME $VERSION_ID"
    else
        echo "错误: 无法检测系统版本"
        exit 1
    fi

    # 检查内存
    total_mem=$(free -m | awk 'NR==2{printf "%.0f", $2}')
    if [ $total_mem -lt 2048 ]; then
        echo "警告: 内存不足2GB"
    else
        echo "内存: ${total_mem}MB"
    fi

    # 检查磁盘空间
    disk_usage=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
    if [ $disk_usage -gt 80 ]; then
        echo "警告: 磁盘使用率超过80%"
    else
        echo "磁盘使用率: ${disk_usage}%"
    fi
}

check_system


依赖安装脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

#!/bin/bash

# 依赖安装脚本
install_dependencies() {
    echo "安装依赖包..."

    # 检测包管理器
    if command -v apt-get &> /dev/null; then
        PKG_MANAGER="apt-get"
        UPDATE_CMD="apt-get update"
        INSTALL_CMD="apt-get install -y"
    elif command -v yum &> /dev/null; then
        PKG_MANAGER="yum"
        UPDATE_CMD="yum check-update"
        INSTALL_CMD="yum install -y"
    else
        echo "错误: 不支持的包管理器"
        exit 1
    fi

    # 更新系统
    echo "更新系统..."
    $UPDATE_CMD

    # 安装基础包
    echo "安装基础包..."
    $INSTALL_CMD curl wget git vim

    # 安装运行时依赖
    echo "安装运行时依赖..."
    if [ "$PKG_MANAGER" = "apt-get" ]; then
        $INSTALL_CMD nginx mysql-server php-fpm
    else
        $INSTALL_CMD nginx mariadb-server php-fpm
    fi
}

install_dependencies


2.2 应用部署

Nginx部署脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

#!/bin/bash

# Nginx部署脚本
deploy_nginx() {
    echo "部署Nginx..."

    # 创建网站目录
    mkdir -p /var/www/myapp
    chown -R www-data:www-data /var/www/myapp

    # 创建网站配置
    cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
    listen 80;
    server_name myapp.local;

    root /var/www/myapp;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location /api {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

    # 启用网站
    ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

    # 测试配置
    nginx -t

    # 重启服务
    systemctl restart nginx
}

deploy_nginx


MySQL部署脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#!/bin/bash

# MySQL部署脚本
deploy_mysql() {
    echo "部署MySQL..."

    # 创建数据库
    mysql -u root -p'RootPassword123!' -e "CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

    # 创建用户
    mysql -u root -p'RootPassword123!' -e "CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'AppPassword123!';"

    # 授权
    mysql -u root -p'RootPassword123!' -e "GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';"

    # 刷新权限
    mysql -u root -p'RootPassword123!' -e "FLUSH PRIVILEGES;"

    echo "MySQL部署完成"
}

deploy_mysql


2.3 服务管理

服务启动脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

#!/bin/bash

# 服务管理脚本
SERVICE_NAME="myapp"
SERVICE_CMD="/usr/bin/myapp"
SERVICE_PID="/var/run/myapp.pid"

start_service() {
    if [ -f $SERVICE_PID ]; then
        echo "服务已在运行"
        return 1
    fi

    echo "启动服务..."
    nohup $SERVICE_CMD > /var/log/myapp.log 2>&1 &
    echo $! > $SERVICE_PID
    echo "服务已启动"
}

stop_service() {
    if [ ! -f $SERVICE_PID ]; then
        echo "服务未运行"
        return 1
    fi

    echo "停止服务..."
    kill $(cat $SERVICE_PID)
    rm -f $SERVICE_PID
    echo "服务已停止"
}

restart_service() {
    stop_service
    sleep 2
    start_service
}

case $1 in
    start)
        start_service
        ;;
    stop)
        stop_service
        ;;
    restart)
        restart_service
        ;;
    status)
        if [ -f $SERVICE_PID ]; then
            echo "服务正在运行"
        else
            echo "服务未运行"
        fi
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac


3. 批量管理

3.1 批量部署

批量部署脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#!/bin/bash

# 批量部署脚本
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="admin"
KEY_FILE="/home/admin/.ssh/id_rsa"

deploy_to_server() {
    local server=$1
    echo "部署到服务器: $server"

    # 复制文件
    scp -i $KEY_FILE -r /tmp/myapp.tar.gz $USER@$server:/tmp/

    # 执行部署
    ssh -i $KEY_FILE $USER@$server "tar -xzf /tmp/myapp.tar.gz -C /opt/ && /opt/myapp/deploy.sh"

    echo "部署完成: $server"
}

# 批量部署
for server in "${SERVERS[@]}"; do
    deploy_to_server $server
done


3.2 批量检查

系统检查脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#!/bin/bash

# 批量系统检查
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="admin"
KEY_FILE="/home/admin/.ssh/id_rsa"

check_server() {
    local server=$1
    echo "检查服务器: $server"

    # 检查CPU使用率
    cpu_usage=$(ssh -i $KEY_FILE $USER@$server "top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}'")
    echo "CPU使用率: ${cpu_usage}%"

    # 检查内存使用
    mem_usage=$(ssh -i $KEY_FILE $USER@$server "free | grep Mem | awk '{print \$3/\$2 * 100.0}'")
    echo "内存使用率: ${mem_usage}%"

    # 检查磁盘使用
    disk_usage=$(ssh -i $KEY_FILE $USER@$server "df -h / | awk 'NR==2{print \$5}' | sed 's/%//'")
    echo "磁盘使用率: ${disk_usage}%"

    echo "---"
}

# 批量检查
for server in "${SERVERS[@]}"; do
    check_server $server
done


3.3 日志分析

日志分析脚本:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#!/bin/bash

# 日志分析脚本
LOG_FILE="/var/log/nginx/access.log"

# 统计访问量
total_requests=$(wc -l < $LOG_FILE)
echo "总请求数: $total_requests"

# 统计IP访问量
echo "TOP 10 IP访问量:"
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10

# 统计URL访问量
echo "TOP 10 URL访问量:"
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr | head -10

# 统计HTTP状态码
echo "HTTP状态码统计:"
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -nr


总结

    Shell脚本自动化是系统管理的重要技能,掌握这些技能不仅能提高工作效率,还能减少人为错误。

关键要点回顾:

  1. 1. 脚本基础:基本语法、条件判断、循环结构
  2. 2. 部署脚本:环境准备、应用部署、服务管理
  3. 3. 批量管理:批量部署、批量检查、日志分析
  4. 4. 错误处理:异常捕获、日志记录、错误恢复
  5. 5. 性能优化:脚本优化、资源管理、并发处理

最新文章

随机文章