跟着GPT学习shell脚本,理论与实践相结合的学习计划。(二)

第9周:项目实战 - 实现一个完整的Shell脚本项目

学习目标
  • 应用所学的Shell脚本知识来实现一个实际项目。
  • 从规划到实现,经历完整的项目开发流程。
项目建议:自动化服务器健康检查脚本

项目描述: 开发一个Shell脚本,用于定期检查服务器的健康状况,包括磁盘空间、内存使用率、负载情况等,并将结果输出到日志文件中。

实施步骤

  1. 需求分析

    • 确定需要监控的服务器指标(例如,磁盘使用率、内存使用率、CPU负载)。
    • 决定输出日志的格式和保存的位置。
  2. 设计脚本

    • 规划脚本的整体结构,包括函数定义和主逻辑流程。
    • 确定如何获取每个监控指标的数据。
  3. 编写脚本

    • 使用Shell命令获取服务器指标。
    • 使用条件语句来判断指标是否处于正常范围。
    • 将监控结果输出到日志文件。
  4. 测试和优化

    • 在服务器上运行脚本,检查其准确性和效率。
    • 根据测试结果进行调整和优化。
  5. 部署脚本

    • 设置定时任务(如使用cron),以定期执行健康检查脚本。
实践任务
  • 任务:根据上述步骤,开始规划和编写您的服务器健康检查脚本。
  • 注意事项
    • 确保在获取系统指标时考虑不同操作系统的兼容性。
    • 考虑脚本的可扩展性,以便未来添加新的监控指标。
#!/bin/bash# 定义日志文件的位置
LOG_FILE="/path/to/health_check.log"# 记录当前日期和时间
echo "Health check on $(date)" >> $LOG_FILE# 检查磁盘使用率
disk_usage=$(df -h | grep '/dev/sda1' | awk '{print $5}')
echo "Disk Usage: $disk_usage" >> $LOG_FILE# 检查内存使用率
memory_usage=$(free -m | grep Mem: | awk '{print $3/$2 * 100.0}')
echo "Memory Usage: $memory_usage%" >> $LOG_FILE# 检查CPU负载
cpu_load=$(top -bn1 | grep load | awk '{printf "%.2f%%\n", $(NF-2)}')
echo "CPU Load: $cpu_load" >> $LOG_FILE# 结束日志
echo "Health check completed on $(date)" >> $LOG_FILE
echo "-----------------------------------" >> $LOG_FILE
  1. #!/bin/bash:指定脚本使用bash shell执行。

  2. LOG_FILE="/path/to/health_check.log":定义日志文件的存储路径。

  3. echo "Health check on $(date)" >> $LOG_FILE:记录健康检查的开始时间。

  4. disk_usage=$(df -h | grep '/dev/sda1' | awk '{print $5}'):获取磁盘使用率。这里/dev/sda1是磁盘的标识,可能需要根据您的系统进行调整。

  5. echo "Disk Usage: $disk_usage" >> $LOG_FILE:将磁盘使用率写入日志文件。

  6. memory_usage=$(free -m | grep Mem: | awk '{print $3/$2 * 100.0}'):获取内存使用率。

  7. echo "Memory Usage: $memory_usage%" >> $LOG_FILE:将内存使用率写入日志文件。

  8. cpu_load=$(top -bn1 | grep load | awk '{printf "%.2f%%\n", $(NF-2)}'):获取CPU负载。

  9. echo "CPU Load: $cpu_load" >> $LOG_FILE:将CPU负载写入日志文件。

  10. 最后几行用于在日志文件中标记健康检查的结束,并添加分隔符。

注意事项

  • 确保您有权限写入指定的日志文件路径。
  • 根据您的服务器配置,磁盘、内存和CPU的检测命令可能需要调整。
  • 如果您的服务器有多个磁盘分区或特殊的内存/CPU监控需求,请相应调整脚本。

要部署此脚本,您可以使用cron来定期执行。例如,每天运行一次,可以添加如下的cron任务: 

0 0 * * * /path/to/your_script.sh

cron是什么:

Linux系统中的11个Cron命令示例 [安排Cron作业] - 知乎

Linux计划任务(Cron):小白完全指南_linux cron-CSDN博客 

linux中的cron的使用_cerana的技术博客_51CTO博客 

第10周:项目优化和维护

学习目标
  • 学习如何优化和维护现有的Shell脚本项目。
  • 理解脚本维护和迭代的重要性。
项目阶段:优化和维护您的服务器健康检查脚本

关键任务

  1. 性能优化

    • 分析脚本的执行效率,确定是否存在性能瓶颈。
    • 优化耗时的操作,例如减少不必要的文件读写,或合并一些命令。
  2. 代码重构

    • 检查脚本结构,确保它清晰易读。
    • 如果需要,重构代码以提高可读性和可维护性。
  3. 功能扩展

    • 根据需要添加新功能,如发送邮件通知、生成更详细的报告等。
    • 确保新功能的集成不会影响脚本的稳定性。
  4. 错误处理和日志记录

    • 加强错误处理逻辑,确保在遇到问题时脚本能够优雅地处理。
    • 改进日志记录机制,使其提供更有用的信息。
  5. 用户反馈和持续改进

    • 获取用户反馈,了解脚本在实际运行中的表现。
    • 根据反馈不断改进脚本。
实践任务
  • 任务:根据上述关键任务,开始优化和扩展您的服务器健康检查脚本。
  • 注意事项
    • 在添加新功能或进行重大更改时,确保进行充分的测试。
    • 考虑编写文档说明脚本的使用方法和配置过程,特别是如果您计划与他人共享脚本。
#!/bin/bashLOG_FILE="/path/to/health_check.log"# 发送邮件通知的函数
send_email() {local subject=$1local body=$2echo "$body" | mail -s "$subject" admin@example.com
}# 记录日志的函数
log() {echo "[$(date)] $1" >> $LOG_FILE
}# 检查磁盘使用率
check_disk_usage() {local usage=$(df -h | grep '/dev/sda1' | awk '{print $5}' | sed 's/%//')log "Disk Usage: $usage%"if [ $usage -gt 90 ]; thensend_email "Disk Usage Alert" "Disk usage is above 90%: $usage%"fi
}# 检查内存使用率
check_memory_usage() {local usage=$(free -m | awk '/Mem:/ {print int($3/$2 * 100.0)}')log "Memory Usage: $usage%"if [ $usage -gt 80 ]; thensend_email "Memory Usage Alert" "Memory usage is above 80%: $usage%"fi
}# 检查CPU负载
check_cpu_load() {local load=$(top -bn1 | grep load | awk '{printf "%.2f", $(NF-2)}')log "CPU Load: $load"if (( $(echo "$load > 1.00" | bc -l) )); thensend_email "CPU Load Alert" "CPU load is above 1.00: $load"fi
}log "Starting health check"
check_disk_usage
check_memory_usage
check_cpu_load
log "Health check completed"
  1. 邮件通知函数 (send_email): 这个函数用于在检测到高资源使用率时发送邮件通知。它接受主题和正文作为参数。

  2. 日志记录函数 (log): 该函数简化了日志记录过程,为日志条目添加时间戳。

  3. 磁盘使用率检查 (check_disk_usage): 这个函数检查磁盘使用率。如果超过90%,将发送邮件通知。

  4. 内存使用率检查 (check_memory_usage): 类似地,这个函数检查内存使用率,并在超过80%时发送警告邮件。

  5. CPU负载检查 (check_cpu_load): 检查CPU负载,如果超过1.00(根据您的系统负载标准调整),则发送警告邮件。

  6. 脚本执行流程: 首先记录开始检查的日志,然后依次执行磁盘、内存和CPU的检查,最后记录健康检查完成的日志。

注意事项

  • 确保邮件发送命令(mail)在您的服务器上正确配置。
  • 替换admin@example.com为实际的接收邮件地址。
  • 根据您的服务器配置和需求,调整警告阈值和检查标准。
  • 在部署之前充分测试脚本,确保所有功能按预期工作。
  • 考虑添加更多的错误处理和边缘情况检查,以增强脚本的健壮性。

此脚本通过加入邮件通知和更细致的日志记录,提高了健康检查的实用性和可靠性。这些改进使脚本成为一个更完整、更健壮的工具,能够更好地服务于系统管理任务。

第11周:Shell脚本的安全性和最佳实践

学习目标
  • 学习如何编写安全的Shell脚本。
  • 掌握Shell脚本编写的最佳实践。
学习内容
  1. Shell脚本安全性

    • 避免使用不安全的数据和命令,如直接使用未经验证的用户输入。
    • 使用引号来处理变量和字符串,避免意外的文件名扩展或词拆分。
    • 检查和处理外部命令的执行结果。
  2. Shell脚本最佳实践

    • 使用清晰的代码结构和一致的代码风格。
    • 添加注释,描述脚本的目的和主要功能。
    • 使用函数组织代码,提高代码的复用性和可读性。
    • 避免过度复杂的逻辑,使脚本易于维护和理解。
    • 考虑跨平台兼容性,特别是在不同的Shell环境下。
实践任务
  • 任务:编写一个简单的Shell脚本,展示安全措施和最佳实践。

#!/bin/bash# 安全地处理用户输入
safe_script() {local input=$1echo "Processing: $input"# 在这里添加更多的处理逻辑
}# 主函数,用于组织脚本逻辑
main() {if [ $# -eq 0 ]; thenecho "No arguments provided"exit 1fisafe_script "$1"
}# 调用主函数
main "$@"

脚本解释

  • 这个脚本定义了一个safe_script函数,用于安全地处理用户输入。
  • main函数检查是否提供了参数,并调用safe_script
  • 通过使用引号和局部变量,脚本减少了出错的可能性。
  • 脚本结构清晰,易于理解和维护。

 

第12周:Shell脚本的高级特性探索

学习目标
  • 深入了解Shell脚本的高级特性。
  • 学习如何利用这些高级特性来解决复杂问题。
学习内容
  1. 正则表达式和模式匹配

    • 使用正则表达式进行复杂的文本处理。
    • grep, sed, 和 awk等命令中应用正则表达式。
  2. 高级I/O操作

    • 使用文件描述符进行高级输入输出控制。
    • 理解并使用管道和重定向的高级用法。
  3. Shell脚本调试技巧

    • 使用set -x, set -e, trap, 和其他调试技术。
    • 编写易于调试的脚本。
  4. 脚本优化技巧

    • 使用子shell和进程替换来减少资源消耗。
    • 优化循环和条件判断,提高脚本效率。
实践任务
  • 任务:编写一个Shell脚本,展示以上高级特性的使用。

#!/bin/bash# 使用正则表达式匹配
regex_example() {echo "Enter a string:"read strif [[ $str =~ ^[A-Za-z]+$ ]]; thenecho "String contains only letters"elseecho "String contains other characters"fi
}# 高级I/O操作示例
io_example() {exec 3<> /tmp/example.txtecho "Hello, world!" >&3exec 3>&-
}regex_example
io_example

让我们逐步解释您提供的脚本中的每个部分:

  1. #!/bin/bash

    • 这行是一个shebang,它告诉系统这个脚本应该用bash shell来执行。
  2. 正则表达式匹配的函数 (regex_example):

    • regex_example() { ... }
      • 定义了一个名为regex_example的函数。
    • echo "Enter a string:"
      • 打印提示,要求用户输入一个字符串。
    • read str
      • 读取用户的输入并将其赋值给变量str
    • if [[ $str =~ ^[A-Za-z]+$ ]]; then
      • 使用[[ ... ]]进行条件测试。这里使用了正则表达式^[A-Za-z]+$,它匹配仅包含字母的字符串。如果str符合这个模式,条件为真。
    • echo "String contains only letters"
      • 如果字符串只包含字母,打印这条消息。
    • else echo "String contains other characters"
      • 如果字符串包含除字母以外的字符,打印这条消息。
    • fi
      • 结束if语句块。
  3. 高级I/O操作的函数 (io_example):

    • io_example() { ... }
      • 定义了一个名为io_example的函数。
    • exec 3<> /tmp/example.txt
      • 这行打开/tmp/example.txt文件,并将文件描述符3(通常不用于标准输入、输出、错误)与其关联。<>表示同时用于读写。
    • echo "Hello, world!" >&3
      • 将字符串Hello, world!写入到文件描述符3关联的文件(/tmp/example.txt)。
    • exec 3>&-
      • 关闭文件描述符3。
  4. 调用这些函数:

    • regex_example
      • 调用regex_example函数。
    • io_example
      • 调用io_example函数。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java语言判断一个数据类型是奇数还是偶数

判断一个数字类型是奇数&#xff0c;还是偶数&#xff0c;只需要引入Scanner类&#xff0c;然后按照数据类型的定义方式进行定义&#xff0c;比较是按照与2进行整除后的结果&#xff1b;如果余数为零&#xff0c;则代表为偶数&#xff0c;否则为奇数。 import java.util.Scann…

一起学习云计算

目录 前言 一、云计算是什么&#xff1f; 二、云计算的组成 三、交付模型 四、 云部署模式 前言 随着经济社会的迅速发展&#xff0c;人们对于网络资源的要求量也越来越高&#xff0c;随之出现的一系列网络平台及服务也越来越多&#xff0c;对于云计算的出现提供了必…

★136. 只出现一次的数字(位运算)

136. 只出现一次的数字 这个题主要考察的知识点是位运算&#xff08;这里是异或&#xff09; 如果不要求空间复杂度为O&#xff08;1&#xff09;&#xff0c;那有很多方法。但是这里有这样的要求。 可以通过位运算 的方法来实现。 异或运算 ⊕有以下三个性质&#xff1a; 任…

Mysql中的正经行锁、间隙锁和临键锁

行锁、间隙锁和临键锁是数据库中的三种不同类型的锁&#xff0c;三者都属于行锁&#xff0c;第一个一般叫他正经的行锁&#xff08;《Mysql是怎样运行的》一书中的说法&#xff09;。 行锁&#xff08;Row Lock&#xff09;&#xff1a;行锁是指对数据表中的某一行进行的锁定操…

数据分析师的学习之路-pandas篇(6)

接上篇&#xff0c;画图告一段落&#xff0c;现在学习表格的各种操作。 3.8 表格操作 3.8.1 表的校验 表里有些列的数据是有一定的要求的&#xff0c;比如说下面这个表&#xff0c;Score分数列&#xff0c;要求成绩只能是0到100&#xff0c;那如果有出现错误的数据&#xff0…

Swift 常用关键字

目录 一、数据类型 1. 流程控制 2. 访问控制 3. 功能修饰词 4. 错误处理 5. 泛型和类型 6. 其它关键字 二、部分关键字说明 1. guard 2. class 和 struct struct&#xff08;结构体&#xff09; class&#xff08;类&#xff09; 使用场景 3. mutating 4. proto…

【算法专题】前缀和

前缀和 前缀和1. 前缀和【模板】2. 二维前缀和【模板】3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为K的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 前缀和 1. 前缀和【模板】 题目链接 -> Nowcoder -DP34.前缀和【模板】 Nowcoder -DP34.前缀和【模…

nodejs微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

matlab实践(九):分段线性插值与三次样条插值

题目 用matlab对572所在区间分别进行分段线性插值、三次样条插值&#xff0c;计算出151&#xff0c;159&#xff0c;984&#xff0c;995的对数值&#xff0c;画出图形并在图形上用红色圆圈标记151&#xff0c;159&#xff0c;984&#xff0c;995所在的点,同时在图形中显示这些…

Java Socket编程之基于TCP协议通信

1.说明 Socket&#xff08;套接字&#xff09;是计算机网络编程中用于实现网络通信的一种编程接口或抽象概念。 它提供了一种标准的接口&#xff0c;使应用程序能够通过网络与其他计算机进行通信。 Socket可以看作是应用程序与网络之间的一个通信端点&#xff0c;类似于电话中…

Opencv获取笔记本摄像头

视频流和摄像头都是一帧一帧图片拼起来的&#xff0c;所以打开摄像头就是获取每帧的图片。 def video_demo():capture cv.VideoCapture(0)while(True):ret,frame capture.read()#ret和frame为read函数的两个返回值&#xff0c;其为一帧一帧的图片frame cv.flip(frame,1)#原…

如何在 Chrome 上调试文件打断点

1. 控制台进入 Source 2. CtrlP 输入文件名称 3. 在需要的位置手动打断点 4. 重新触发代码运行&#xff0c;触发断点

分享 | 顶刊高质量论文插图配色(含RGB值及16进制HEX码)(第一期)

我在很早之前出过一期高质量论文绘图配色&#xff0c;但当时觉得搜集太麻烦于是就没继续做&#xff0c;后来用MATLAB爬了上万张顶刊绘图&#xff0c;于是又想起来做这么一个系列&#xff0c;拿了一个多小时写了个提取论文图片颜色并得出RGB值和16进制码并标注在原图的代码&…

简单了解传输层协议之TCP和UDP

目录 一、什么是端口号? 二、TCP协议 2.1 TCP报文格式 2.2 三次握手 2.3 四次挥手 2.4 窗口流量控制 三、UDP协议 3.1 UDP报文格式 3.4 传输过程 一、什么是端口号? 我们自己的一台电脑上有时可能会同时运行多个进程软件来进行上网。那么当网络上的服务器响应我们电…

Chrome清除特定网站的Cookie,从而让网址能正常运行(例如GPT)

Chrome在使用某些网址的时候&#xff0c;例如GPT的时候&#xff0c;可能会出现无法访问这个网址的情况&#xff0c;就是点不动啥的 只需要把你需要重置的网址删除就好了

C语言小游戏:三子棋

目录 &#x1f30d;前言 &#x1f685;目录设计 &#x1f48e;游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 &#x1f440;怎么设置人下棋 &#x1f440;怎么设置电脑下棋 ✈如何判断输赢 ✍结语 &#x1f30d;前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…

根据源码梳理Redisson的可重入、锁重试以及看门狗机制原理

Redisson可重入的原理 在上篇文章中我们已经知道了除了需要存储线程标识外&#xff0c;会额外存储一个锁重入次数。那么接下来我们查看使用Redisson时&#xff0c;Redisson的加锁与释放锁流程图。 当开始获取锁时&#xff0c;会先判断锁是否存在&#xff0c;如果存在再进行判断…

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …

EM32DX-C4【C#】

1外观&#xff1a; J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI&#xff1a; 公共端是…

XUbuntu22.04之OBS30.0设置录制音频降噪(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…