在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载

#!/bin/bash

# 指定要检查的文件夹路径
folder_path="/path/to/folder"

# 获取当前日期前三天的日期
three_days_ago=$(date -d "3 days ago" +%Y%m%d)

# 获取当前日期时间
datetime=$(date +%Y%m%d_%H%M%S)

# 检查文件夹容量,如果超过10G就删除3天前的内容
folder_size=$(du -s $folder_path | awk '{print $1}')
if [ $folder_size -gt 10485760 ]; then
  echo "$datetime: Folder size exceeds 10G, deleting files before $three_days_ago"
  find $folder_path -type f -name "*" -mtime +3 -delete
fi

# 检查内存和CPU利用率,如果超过80%就提示用户出现过载
mem_usage=$(free | awk '/Mem/{printf("%.2f"), $3/$2*100}')
cpu_usage=$(top -bn1 | awk '/Cpu/{printf("%.2f"), $2}')
if (( $(echo "$mem_usage > 80" | bc -l) )) || (( $(echo "$cpu_usage > 80" | bc -l) )); then
  echo "$datetime: System is overloaded, please take action"
fi

将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

crontab -e
0 3 * * * /path/to/script.sh

以下是 system_check.sh 脚本中每一行的详细解释:

#!/bin/bash

这是 Bash 脚本的第一行,用于指定脚本使用的解释器。在这里,#!/bin/bash 表示使用 Bash 解释器来执行该脚本。

# 指定要检查的文件夹路径
folder_path="/path/to/folder"

这一行定义了一个变量 folder_path,用于指定要检查的文件夹路径。在这里,变量的值为 /path/to/folder,可以根据实际情况修改。

# 获取当前日期前三天的日期
three_days_ago=$(date -d "3 days ago" +%Y%m%d)

这一行使用 date 命令获取当前日期前三天的日期,并将其保存到变量 three_days_ago 中。+%Y%m%d 表示设置日期的格式为年月日,例如 20220101

# 获取当前日期时间
datetime=$(date +%Y%m%d_%H%M%S)

这一行使用 date 命令获取当前日期时间,并将其保存到变量 datetime 中。+%Y%m%d_%H%M%S 表示设置日期时间的格式为年月日_时分秒,例如 20220101_120000

# 检查文件夹容量,如果超过10G就删除3天前的内容
folder_size=$(du -s $folder_path | awk '{print $1}')
if [ $folder_size -gt 10485760 ]; then
  echo "$datetime: Folder size exceeds 10G, deleting files before $three_days_ago"
  find $folder_path -type f -name "*" -mtime +3 -delete
fi

这一段代码用于检查文件夹容量,如果超过10G就删除3天前的内容。具体来说:

  • du -s $folder_path 命令用于计算指定文件夹的容量大小,并将结果保存到变量 folder_size 中。-s 表示只显示总计大小,不显示每个子目录的大小。
  • if [ $folder_size -gt 10485760 ]; then 表示如果文件夹的容量大小超过10G(即 10485760 KB),则执行下面的命令。
  • echo "$datetime: Folder size exceeds 10G, deleting files before $three_days_ago" 表示输出一条提示信息,指示文件夹容量超过10G,并将日期时间和三天前的日期插入到提示信息中。
  • find $folder_path -type f -name "*" -mtime +3 -delete 命令用于查找并删除文件夹中3天前的文件。-type f 表示只查找文件,-name "*" 表示查找所有文件,-mtime +3 表示查找修改时间在3天前的文件,-delete 表示删除查找到的文件。
# 检查内存和CPU利用率,如果超过80%就提示用户出现过载
mem_usage=$(free | awk '/Mem/{printf("%.2f"), $3/$2*100}')
cpu_usage=$(top -bn1 | awk '/Cpu/{printf("%.2f"), $2}')
if (( $(echo "$mem_usage > 80" | bc -l) )) || (( $(echo "$cpu_usage > 80" | bc -l) )); then
  echo "$datetime: System is overloaded, please take action"
fi

这一段代码用于检查内存和 CPU 利用率,如果超过80%就提示用户出现过载。- free 命令用于查看系统内存使用情况。| awk '/Mem/{printf("%.2f"), $3/$2*100}' 表示将 free 命令的输出通过管道传递给 awk 命令,查找含有 Mem 的行,并计算内存使用率。$3/$2*100 表示计算已用内存占总内存的百分比,并输出到变量 mem_usage 中。

  • top -bn1 命令用于查看当前 CPU 使用情况。| awk '/Cpu/{printf("%.2f"), $2}' 表示将 top 命令的输出通过管道传递给 awk 命令,查找含有 Cpu 的行,并输出第二个字段(即 CPU 利用率)到变量 cpu_usage 中。
  • if (( $(echo "$mem_usage > 80" | bc -l) )) || (( $(echo "$cpu_usage > 80" | bc -l) )); then 表示如果内存使用率或 CPU 利用率超过80%,则执行下面的命令。
  • echo "$datetime: System is overloaded, please take action" 表示输出一条提示信息,指示系统出现过载,并将日期时间插入到提示信息中。

总的来说,该脚本用于检查系统状态,包括文件夹容量和系统资源利用率等方面,如果出现异常情况,则会提示用户采取相应的行动。

Logo

更多推荐