【Shell编程 / 9】脚本实战项目:从基础到进阶的自动化管理方案

news/2025/2/23 18:52:31

文章目录

  • Shell脚本实战项目
    • 自动化部署脚本
    • 系统监控脚本
    • 文件备份脚本
    • 定时任务管理脚本
    • 文件传输自动化脚本
    • 自动化日志清理脚本
    • 用户管理脚本

Shell脚本实战项目

在掌握了 Shell 脚本的基本语法和高级技巧后,实践是进一步提升脚本编写能力的关键。通过参与一些实际的项目,我们可以更加熟练地运用 Shell 脚本来自动化任务,提升工作效率。

自动化部署脚本

自动化部署是运维和开发中常见的任务。通过编写自动化部署脚本,我们可以将繁琐的部署过程简化,确保部署的一致性和效率。

  1. 自动化部署脚本示例
    假设我们需要部署一个 Web 应用,并且该应用依赖于数据库和其他服务。我们可以通过一个 Shell 脚本来自动化部署过程。

    #!/bin/bash
    
    # 定义变量
    APP_DIR="/var/www/myapp"
    BACKUP_DIR="/var/backups/myapp"
    DB_NAME="myapp_db"
    DB_USER="root"
    DB_PASS="password"
    
    # 步骤1: 更新系统
    echo "Updating system..."
    apt-get update -y
    apt-get upgrade -y
    
    # 步骤2: 安装必要的软件包
    echo "Installing required packages..."
    apt-get install -y apache2 mysql-server git
    
    # 步骤3: 克隆项目代码
    echo "Cloning the project from GitHub..."
    git clone https://github.com/user/myapp.git $APP_DIR
    
    # 步骤4: 设置文件权限
    echo "Setting permissions..."
    chown -R www-data:www-data $APP_DIR
    
    # 步骤5: 配置数据库
    echo "Setting up the database..."
    mysql -u $DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME;"
    
    # 步骤6: 启动服务
    echo "Starting the application..."
    systemctl start apache2
    systemctl start mysql
    
    echo "Deployment completed!"
    

    说明

    • 脚本首先更新系统和安装依赖的软件包。
    • 然后,克隆 GitHub 上的项目代码到指定目录。
    • 设置文件和目录的权限,确保 Web 服务器能正确访问。
    • 最后,配置数据库并启动服务。

    扩展功能

    • 可以通过 cronsystemd 设置定时自动化部署。
    • 使用 git pull 来更新项目代码,而不是每次都进行克隆。

系统监控脚本

系统监控脚本用于实时监控系统的健康状态,及时发现并处理问题。通过这些脚本,运维人员可以更高效地管理服务器,避免系统出现故障。

  1. 系统监控脚本示例
    下面是一个简单的系统监控脚本,用于检查系统资源使用情况,如 CPU、内存、磁盘等,并将结果输出到日志文件中。

    #!/bin/bash
    
    # 定义日志文件
    LOGFILE="/var/log/system_monitor.log"
    
    # 获取当前日期和时间
    DATE=$(date '+%Y-%m-%d %H:%M:%S')
    
    # 记录当前日期和时间
    echo "Monitoring started at $DATE" >> $LOGFILE
    
    # 检查 CPU 使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    echo "CPU Usage: $CPU_USAGE%" >> $LOGFILE
    
    # 检查内存使用情况
    MEM_USAGE=$(free -m | grep Mem | awk '{print $3/$2 * 100.0}')
    echo "Memory Usage: $MEM_USAGE%" >> $LOGFILE
    
    # 检查磁盘空间
    DISK_USAGE=$(df -h | grep '^/dev/' | awk '{ print $5 " " $6 }')
    echo "Disk Usage:" >> $LOGFILE
    echo "$DISK_USAGE" >> $LOGFILE
    
    # 检查当前登录的用户
    USERS=$(who)
    echo "Logged-in Users:" >> $LOGFILE
    echo "$USERS" >> $LOGFILE
    
    # 完成监控
    echo "Monitoring completed at $(date '+%Y-%m-%d %H:%M:%S')" >> $LOGFILE
    

    说明

    • 脚本首先记录当前的时间戳。
    • 然后,使用 top 命令获取 CPU 使用率,free 命令获取内存使用情况,df 命令检查磁盘空间。
    • 所有监控信息都会输出到日志文件 /var/log/system_monitor.log 中,便于后续查看。

    扩展功能

    • 可以通过 cron 定期执行此脚本,实时记录系统状态。
    • 可以加入告警机制,当某项资源使用率超过阈值时发送邮件或短信通知。

文件备份脚本

在生产环境中,定期备份是确保数据安全和可靠性的关键。通过编写一个自动化备份脚本,可以定期备份重要文件或目录,并进行压缩和远程存储。

示例

#!/bin/bash

# 定义备份目录和目标存储路径
SOURCE_DIR="/home/user/important_data"
BACKUP_DIR="/var/backups"
REMOTE_SERVER="user@backup-server:/backups"
DATE=$(date '+%Y-%m-%d-%H%M%S')

# 步骤1: 创建备份文件夹(如果不存在)
mkdir -p $BACKUP_DIR

# 步骤2: 压缩并备份文件
echo "Starting backup of $SOURCE_DIR to $BACKUP_DIR/backup-$DATE.tar.gz"
tar -czf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE_DIR

# 步骤3: 将备份文件上传至远程服务器
echo "Uploading backup to remote server..."
scp $BACKUP_DIR/backup-$DATE.tar.gz $REMOTE_SERVER

# 步骤4: 清理过期的备份文件(保留最近7个备份)
echo "Cleaning up old backups..."
cd $BACKUP_DIR
ls -t | grep "backup-" | awk 'NR>7' | xargs rm -f

echo "Backup completed!"

说明

  • 脚本会创建备份文件并进行压缩。
  • 然后,它会将备份文件上传到远程服务器。
  • 最后,脚本清理掉过期的备份,只保留最近7个备份文件。

扩展功能

  • 可以使用 cron 来定期执行备份任务。
  • 增加备份通知(通过邮件等方式)告知备份成功或失败。

定时任务管理脚本

在 Linux 系统中,cron 是最常用的定时任务管理工具。通过 Shell 脚本,用户可以简化定时任务的添加、删除和查看操作,避免手动编辑 crontab 文件。

示例

#!/bin/bash

# 定义任务和时间参数
TASK_COMMAND="$1"
TASK_TIME="$2"
TASK_NAME="$3"

# 检查输入参数
if [[ -z "$TASK_COMMAND" || -z "$TASK_TIME" || -z "$TASK_NAME" ]]; then
    echo "Usage: $0 <command> <time> <task_name>"
    exit 1
fi

# 添加定时任务
echo "$TASK_TIME $TASK_COMMAND # Task: $TASK_NAME" >> /etc/crontab

# 重新加载 crontab 配置
systemctl restart cron

echo "Scheduled task '$TASK_NAME' added successfully!"

说明

  • 脚本允许用户传入定时任务命令、执行时间和任务名称。
  • 它会将任务添加到系统的 crontab 文件中,并重启 cron 服务,使之生效。

扩展功能

  • 可以加入功能来删除指定任务,或者列出当前所有的定时任务。
  • 可以扩展为检查时间格式的有效性,避免输入错误的时间参数。

文件传输自动化脚本

在日常运维中,文件的自动化传输是非常常见的需求。通过 Shell 脚本,可以实现文件从本地到远程服务器,或者从一个服务器到另一个服务器的自动传输。

示例

#!/bin/bash

# 定义源文件夹和目标路径
SOURCE_DIR="/home/user/files"
TARGET_SERVER="user@remote-server:/home/user/backup"
DATE=$(date '+%Y-%m-%d-%H%M%S')

# 步骤1: 压缩文件
echo "Compressing files in $SOURCE_DIR..."
tar -czf /tmp/files_$DATE.tar.gz -C $SOURCE_DIR .

# 步骤2: 传输文件到远程服务器
echo "Transferring files to remote server..."
scp /tmp/files_$DATE.tar.gz $TARGET_SERVER

# 步骤3: 清理临时文件
rm -f /tmp/files_$DATE.tar.gz

echo "File transfer completed!"

说明

  • 脚本将指定目录的文件进行压缩。
  • 然后将压缩文件通过 scp 命令传输到远程服务器。
  • 最后,清理掉临时文件。

扩展功能

  • 可以加上同步检查,避免重复传输。
  • 在传输过程中,增加重试机制,确保文件传输成功。

自动化日志清理脚本

为了保证系统的稳定性,定期清理日志文件是非常重要的。过多的日志文件会占用磁盘空间,影响系统性能。通过 Shell 脚本,可以定期清理指定的日志文件。

示例

#!/bin/bash

# 定义日志目录和保留的天数
LOG_DIR="/var/log"
RETENTION_DAYS=30

# 步骤1: 查找并删除超过 $RETENTION_DAYS 天的日志文件
echo "Cleaning up logs older than $RETENTION_DAYS days..."
find $LOG_DIR -type f -name "*.log" -mtime +$RETENTION_DAYS -exec rm -f {} \;

echo "Log cleanup completed!"

说明

  • 脚本会查找指定目录下所有 .log 文件,并删除超过指定天数的日志文件。
  • 我们可以根据需要调整 RETENTION_DAYS 的值,控制日志保留的时间。

扩展功能

  • 可以增加日志备份功能,在删除日志之前先备份到指定目录。
  • 可以通过邮件通知系统管理员清理的结果。

用户管理脚本

在多人使用的系统中,管理用户账户是运维人员的常见任务。通过 Shell 脚本,可以简化添加、删除、修改用户的过程。

示例

#!/bin/bash

# 获取操作类型(添加、删除、修改)
ACTION=$1
USER_NAME=$2
USER_PASSWORD=$3

# 判断是否传入必要的参数
if [[ -z "$ACTION" || -z "$USER_NAME" ]]; then
    echo "Usage: $0 <add|del|modify> <username> [password]"
    exit 1
fi

# 根据不同的操作执行
case $ACTION in
    add)
        # 添加用户
        if id "$USER_NAME" &>/dev/null; then
            echo "User $USER_NAME already exists!"
        else
            useradd "$USER_NAME"
            if [[ -n "$USER_PASSWORD" ]]; then
                echo "$USER_NAME:$USER_PASSWORD" | chpasswd
            fi
            echo "User $USER_NAME added successfully!"
        fi
        ;;
    del)
        # 删除用户
        userdel -r "$USER_NAME"
        echo "User $USER_NAME deleted successfully!"
        ;;
    modify)
        # 修改用户密码
        if [[ -n "$USER_PASSWORD" ]]; then
            echo "$USER_NAME:$USER_PASSWORD" | chpasswd
            echo "Password for $USER_NAME modified successfully!"
        else
            echo "Please provide a new password!"
            exit 1
        fi
        ;;
    *)
        echo "Invalid action! Use add, del or modify."
        exit 1
        ;;
esac

说明

  • 该脚本可以用于添加、删除和修改用户账户。
  • 可以通过输入参数来指定操作类型(添加、删除、修改),以及要操作的用户名和密码。

扩展功能

  • 可以加入更多用户信息的设置,比如分配用户组等。
  • 通过邮件通知操作结果,或记录操作日志。

http://www.niftyadmin.cn/n/5863687.html

相关文章

一种简单有效的分析qnx+android智能座舱项目中的画面闪烁的方法(8155平台)

在智能座舱项目的开发过程中&#xff0c;画面闪烁问题是一个常见但棘手的挑战。由于这些闪烁现象往往转瞬即逝&#xff0c;传统的分析工具如截图、录屏或dump图层等方法难以捕捉和定位问题根源。针对这一难题&#xff0c;本文介绍了一种较为有效的分析方法&#xff0c;能够帮助…

使用Supervisor管理PHP脚本进程任务

Supervisor 是一个用 Python 编写的进程管理工具&#xff0c;用于监控和管理后台进程。它可以帮助你确保某些进程&#xff08;如 PHP 消费者脚本&#xff09;持续运行&#xff0c;并在进程崩溃或服务器重启后自动重启。 在 PHP Redis 实现异步处理的场景中&#xff0c;Supervi…

机器翻译与语音识别技术:推动人机交互的新篇章

在数字化时代&#xff0c;语言不仅是人类交流的基本工具&#xff0c;也是连接不同文化和国家的桥梁。随着科技的飞速发展&#xff0c;机器翻译与语音识别技术作为语言处理领域的两大核心技术&#xff0c;正逐步改变着人类与计算机之间的交互方式。本文将深入探讨这两种技术的原…

vue-treeselect显示unknown的问题及解决

问题 解决办法 去node-modules包里面找到这个组件的源码&#xff0c;在它dist文件里面找到这个文件&#xff0c;然后搜索unknown&#xff0c;把它删掉就可以解决了。

使用AI创建流程图和图表的 3 种简单方法

你可能已经尝试过使用 LLMs 生成图像&#xff0c;但你有没有想过用它们来创建 流程图和图表&#xff1f;这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常&#xff0c;在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗&#xff1f;你可以使用 LLMs 通过简…

LLVM编译器简介

LLVM相关知识 LLVM是一个极具影响力的编译器基础设施项目&#xff0c;最初代表“Low Level Virtual Machine&#xff08;低级虚拟机&#xff09;” &#xff0c;如今已演变为一套通用的、强大的编译技术体系&#xff0c;为现代软件开发提供了高效的编译解决方案。 一、LLVM基…

前端接收后端19位数字参数,精度丢失的问题

这里写自定义目录标题 安装插件json-bigint在封装请求的文件中配置 安装插件json-bigint 前端一般都是用axios进行数据请求&#xff0c;故引入json-bigint。 npm install json-bigint在封装请求的文件中配置 axios.create()之前配置 import JSONBIG from json-bigint impor…

STM32-有关内存堆栈、map文件

STM32堆栈空间大小设置_stm32堆栈分配大小-CSDN博客 STM32堆栈的大小及内存四&#xff08;五&#xff09;区的分析 - 天街小雨润地狠 - 博客园 .map文件的位置