当前位置: 首页 > news >正文

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

文章目录

  • 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

说明

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

扩展功能

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

相关文章:

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

文章目录 Shell脚本实战项目自动化部署脚本系统监控脚本文件备份脚本定时任务管理脚本文件传输自动化脚本自动化日志清理脚本用户管理脚本 Shell脚本实战项目 在掌握了 Shell 脚本的基本语法和高级技巧后&#xff0c;实践是进一步提升脚本编写能力的关键。通过参与一些实际的项…...

在PyTorch中使用插值法来优化卷积神经网络(CNN)所需硬件资源

插值法其实就是在已知数据点之间估计未知点的值。通过已知的离散数据点,构造一个连续的曲线函数,预测数据点之间的空缺值是什么并且自动填补上去。 适用场景: 在卷积神经网络(CNN)中的应用场景中,经常遇到计算资源有限,比如显存不够或者处理速度慢,需要用插值来降低计…...

黄金市场现状与驱动因素分析

一、当前市场现状&#xff1a;挤兑、运力与供应链危机 全球金库告急与运输瓶颈 伦敦商业银行金库的黄金存量告急&#xff0c;纽约和伦敦市场出现“史诗级挤兑”。提取英格兰银行金库的黄金需等待4-8周&#xff0c;远高于常规的几天时间[citation:用户描述]。专业运输车辆超负荷…...

Linux arm64 IOMMU总结

一、DMA的引入 Non-DMA&#xff1a;CPU直接与设备进行数据交互&#xff0c;CPU的负载会随着数据的读写而增加&#xff1b; DMA&#xff1a;CPU不参与数据的直接传输&#xff0c;DMA Controller负责Device与Memory之间的数据搬运&#xff0c;并以中断信号的形式通知CPU&#xf…...

服务器通过 ollama 运行deepseek r1

1、服务器环境简介 56核 CPU64G 内存无显卡已安装 Ollama 2、下载模型与配置 正常可以通过 ollama pull 或 ollama run 命令直接下载&#xff0c;但通常会遇到连接超时、找不到网址等总理。因此&#xff0c;可以使用国内的模型站进行下载&#xff0c;在这里使用魔塔查找模型…...

MYSQL学习笔记(九):MYSQL表的“增删改查”

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇讲述一些在MYSQL的数据类型&#xff0c;和表的“增删改查”基本操作;虽然MYSQ…...

Oracle JDK、Open JDK zulu下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡...

分类解析决策模型

一、按理性程度划分的决策模型 1. 完全理性模型(古典决策理论) 核心假设:决策者拥有完全信息,能计算所有选项的效用并选择最优解。数学模型: 期望效用理论(Expected Utility Theory, EU): E U = ∑ ( p i...

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议&#xff08;ICPQC 2025&#xff09;将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家&#xff0c;共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展&#xff0c;其在信息处…...

【网络】高级IO——Reactor版TCP服务器

1.什么是Reactor Reactor 是一种应用在服务器端的开发模式&#xff08;也有说法称 Reactor 是一种 IO 模式&#xff09;&#xff0c;目的是提高服务端程序的并发能力 它要解决什么问题呢&#xff1f; 传统的 thread per connection 用法中&#xff0c;线程在真正处理请求之前首…...

3.Docker常用命令

1.Docker启动类命令 1.启动Docker systemctl start docker 2.停止Docker systemctl stop docker 3.重启Docker systemctl restart docker 4.查看Docker状态 systemctl status docker 5.设置开机自启(执行此命令后每次Linux重启后将自启动Docker) systemctl enable do…...

【uni-app】对齐胶囊容器组件

代码碎片 <template><div><view :style"{ height: ${statusBarHeight}px }"></view><viewclass"":style"{height: ${menuButtonHeight menuButtonPadding * 2}px,width: ${menuButtonInfo.left}px,}"><slot …...

JUC并发—10.锁优化与锁故障

大纲 1.标志位修改场景优先使用volatile(服务优雅停机) 2.数值递增场景优先使用Atomic类(心跳计数器) 3.共享变量仅对当前线程可见的场景优先使用ThreadLocal(edits log的处理) 4.读多写少需要加锁的场景优先使用读写锁(服务注册表的并发读写) 5.尽量减少线程对锁占用时间…...

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

大数据学习之PB级音乐数据中心数仓综合项目(1)-理论知识和项目需求、歌曲热度与歌手热度排行

一、理论知识和项目需求 1.课程介绍 2.数据库与ER建模_数据库三范式 3.数据库与ER建模_ER实体关系模型 4.数据库与维度建模_数据仓库(DATA WAREHOUSE) 5.数据库与维度建模_数据库与数据仓库区别 6.数据库与维度建模_数据仓库的发展历程 7.数据库与维度建模_维度建模 8.数据库与…...

DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?

一、引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已然成为推动各领域变革的核心力量。而在人工智能的众多分支中&#xff0c;自然语言处理&#xff08;NLP&#xff09;因其与人类日常交流和信息处理的紧密联系&#xff0c;成为了最受瞩目的领…...

七星棋牌顶级运营产品全开源修复版源码教程:6端支持,200+子游戏玩法,完整搭建指南(含代码解析)

棋牌游戏一直是移动端游戏市场中极具竞争力和受欢迎的品类&#xff0c;而七星棋牌源码修复版无疑是当前行业内不可多得的高质量棋牌项目之一。该项目支持 6大省区版本&#xff08;湖南、湖北、山西、江苏、贵州&#xff09;&#xff0c;拥有 200多种子游戏玩法&#xff0c;同时…...

本2硕9电子科学专业,想走linux或是嵌入式,要具体学哪些技术

​今天给大家分享的是一位粉丝的提问&#xff0c;本2硕9电子科学专业&#xff0c;想走linux或是嵌入式&#xff0c;要具体学哪些技术 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 你好&…...

从混沌到有序:一个数据血缘分析的进化故事

从混沌到有序&#xff1a;一个数据血缘分析的进化故事 从混沌到有序的数据治理之路数据血缘的建设方法和实践路径数据血缘的实践场景和未来趋势。 数据就像流淌在企业血管中的血液&#xff0c;它的每一次流动、每一次转化都留下独特的印记。 作为数据工程师&#xff0c;我曾困惑…...

从猜想终结到算法革新,弹性哈希开启数据存储新篇章

目录 哈希表的前世今生基本原理从传统到现代&#xff1a;哈希表的演变历程 安德鲁 克拉皮文及其团队的创作历程弹性哈希详解基本原理优点技术细节 漏斗哈希解析基本原理优点技术细节 新算法的实际应用案例电子商务推荐系统金融交易监控系统社交媒体内容过滤物联网设备管理 结论…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

shell脚本质数判断

shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数&#xff09;shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数&#xff09; 思路&#xff1a; 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...