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

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

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

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

实施步骤

  1. 需求分析

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

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

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

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

    • 设置定时任务(如使用cron),以定期执行健康检查脚本。
实践任务
  • 任务:根据上述步骤,开始规划和编写您的服务器健康检查脚本。
  • 注意事项
    • 确保在获取系统指标时考虑不同操作系统的兼容性。
    • 考虑脚本的可扩展性,以便未来添加新的监控指标。
bash 复制代码
#!/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任务:

bash 复制代码
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. 用户反馈和持续改进

    • 获取用户反馈,了解脚本在实际运行中的表现。
    • 根据反馈不断改进脚本。
实践任务
  • 任务:根据上述关键任务,开始优化和扩展您的服务器健康检查脚本。
  • 注意事项
    • 在添加新功能或进行重大更改时,确保进行充分的测试。
    • 考虑编写文档说明脚本的使用方法和配置过程,特别是如果您计划与他人共享脚本。
bash 复制代码
#!/bin/bash

LOG_FILE="/path/to/health_check.log"

# 发送邮件通知的函数
send_email() {
    local subject=$1
    local body=$2
    echo "$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 ]; then
        send_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 ]; then
        send_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) )); then
        send_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脚本,展示安全措施和最佳实践。
bash 复制代码
#!/bin/bash

# 安全地处理用户输入
safe_script() {
    local input=$1
    echo "Processing: $input"
    # 在这里添加更多的处理逻辑
}

# 主函数,用于组织脚本逻辑
main() {
    if [ $# -eq 0 ]; then
        echo "No arguments provided"
        exit 1
    fi
    safe_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脚本,展示以上高级特性的使用。
bash 复制代码
#!/bin/bash

# 使用正则表达式匹配
regex_example() {
    echo "Enter a string:"
    read str
    if [[ $str =~ ^[A-Za-z]+$ ]]; then
        echo "String contains only letters"
    else
        echo "String contains other characters"
    fi
}

# 高级I/O操作示例
io_example() {
    exec 3<> /tmp/example.txt
    echo "Hello, world!" >&3
    exec 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函数。
相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习