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

devtools/2025/2/23 11:17:24/

文章目录

  • 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 mysqlecho "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 -fecho "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" ]]; thenecho "Usage: $0 <command> <time> <task_name>"exit 1
fi# 添加定时任务
echo "$TASK_TIME $TASK_COMMAND # Task: $TASK_NAME" >> /etc/crontab# 重新加载 crontab 配置
systemctl restart cronecho "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.gzecho "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" ]]; thenecho "Usage: $0 <add|del|modify> <username> [password]"exit 1
fi# 根据不同的操作执行
case $ACTION inadd)# 添加用户if id "$USER_NAME" &>/dev/null; thenecho "User $USER_NAME already exists!"elseuseradd "$USER_NAME"if [[ -n "$USER_PASSWORD" ]]; thenecho "$USER_NAME:$USER_PASSWORD" | chpasswdfiecho "User $USER_NAME added successfully!"fi;;del)# 删除用户userdel -r "$USER_NAME"echo "User $USER_NAME deleted successfully!";;modify)# 修改用户密码if [[ -n "$USER_PASSWORD" ]]; thenecho "$USER_NAME:$USER_PASSWORD" | chpasswdecho "Password for $USER_NAME modified successfully!"elseecho "Please provide a new password!"exit 1fi;;*)echo "Invalid action! Use add, del or modify."exit 1;;
esac

说明

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

扩展功能

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

http://www.ppmy.cn/devtools/161163.html

相关文章

【Linux】多线程 -> 使用C/C++实现简单的线程池

线程池是一种线程管理机制&#xff0c;它维护着一个线程集合。在程序启动时&#xff0c;线程池会创建一定数量的线程并将它们放在“池”中。当有任务需要执行时&#xff0c;线程池会从池中取出一个空闲线程来执行该任务&#xff0c;任务完成后&#xff0c;线程并不会被销毁&…

利用Java爬虫精准获取淘宝分类详情:实战案例指南

在电商领域&#xff0c;淘宝作为中国最大的电商平台之一&#xff0c;其分类详情数据对于市场分析、竞争策略制定以及电商运营优化具有极高的价值。通过Java爬虫技术&#xff0c;我们可以高效地获取这些数据&#xff0c;为电商从业者提供强大的数据支持。本文将详细介绍如何利用…

【新人系列】Golang 入门(一):基础介绍

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12898955.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Golang 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历&#xff0c;只需要利用队列存放二叉树结点&#xff0c;队列的size代表每层的节点数也就是平均值的除数&#xff0c;利用一个结果数组记录每层平均值&#xff0c;最后返回。 需要注意的是&#xff0c;平均值定义成double类型。 代码如下&…

独立开发者如何寻找产品设计灵感

作为独立开发者&#xff0c;面对激烈的市场竞争和不断变化的用户需求&#xff0c;寻找优秀的产品设计灵感是至关重要的一步。以下是一篇关于独立开发者如何寻找产品设计灵感的教程&#xff0c;希望能为你提供一些有益的指导。 一、观察日常生活 1.1 关注身边的小问题 在日常生…

【网络】DHCP(Dynamic Host Configuration Protocol)

DHCP 解释与比喻&#xff1a; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09; 是一种自动分配 IP 地址和其他网络配置信息的协议。你可以把它想象成“网络中的自动派发信件”。 比喻&#xff1a; 假设你是一名新来的学生&#xff0c;进入一个学校&#x…

CountDownlatch实现原理

文章目录 类图及概要核心方法await() 方法await(long timeout, TimeUnit unit) 方法countDown() 方法getCount() 方法 总结 类图及概要 CountDownLatch 内部有个计数器&#xff0c;并且这个计数器是递减的 。 下面就通过源码看看 JDK 开发组在何时初始化计数器&#xff0c;在何…

高级运维:1. 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。2. 基于 openEuler 构建 LVS-DR 群集。

1. LVS 负载均衡群集的 NAT 模式和 DR 模式的对比 特性NAT 模式DR 模式配置复杂度配置简单&#xff0c;适合初学者和小型网络环境配置相对复杂&#xff0c;需要配置虚拟 IP 和 ARP 抑制性能性能瓶颈可能出现在负载均衡器&#xff0c;不适合高流量场景高性能&#xff0c;响应速…