要定时每分钟获取一次系统的 CPU、内存和磁盘使用情况,并将结果输出到一个 Excel 文件中,你需要做两件事:
-
定时执行任务:使用
cron
来每分钟执行一次脚本。 -
输出到 Excel 文件:通过
Python
脚本将输出结果保存到.xlsx
文件中,利用openpyxl
或pandas
等库来处理 Excel 文件。
解决方案:
步骤 1:编写 Shell 脚本获取系统信息
我们仍然使用一个 Shell 脚本来获取系统信息,但需要将输出结果格式化为 CSV 格式,这样可以方便地导入到 Excel 文件中。
bash#!/bin/bash # 获取当前时间 timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况 memory_usage=$(free -h | grep Mem | awk '{print \$3 "/" \$2}') # 获取磁盘使用情况 disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print \$5}' | head -n 1) # 输出 CSV 格式 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> /path/to/system_usage.csv
解释:
-
时间戳:我们使用
date
命令生成当前时间戳,格式为YYYY-MM-DD HH:MM:SS
。 -
CPU 使用率:通过
top
命令来获取 CPU 使用率(从空闲率计算)。 -
内存使用情况:通过
free -h
获取内存的已用和总量。 -
磁盘使用情况:通过
df -h
获取磁盘使用率,并只选取根文件系统的使用率。
步骤 2:定时执行 Shell 脚本
使用 cron
来每分钟执行一次该脚本。
-
打开
crontab
文件:bashcrontab -e
-
添加以下行,设置每分钟运行脚本:
bash* * * * * /path/to/system_usage.sh
这将会使脚本每分钟执行一次,并将每次的结果追加到 /path/to/system_usage.csv
文件中。
步骤 3:编写 Python 脚本将 CSV 转换为 Excel
接下来,我们编写一个 Python 脚本,将 CSV 文件的内容转换成 Excel 文件。我们使用 pandas
库来处理 CSV 数据,并将其保存为 .xlsx
文件。
-
安装必要的 Python 库:
如果你没有安装
pandas
和openpyxl
,可以通过以下命令安装:bashpip install pandas openpyxl
-
Python 脚本内容:
pythonimport pandas as pd # CSV 文件路径 csv_file = "/path/to/system_usage.csv" excel_file = "/path/to/system_usage.xlsx" # 读取 CSV 文件 df = pd.read_csv(csv_file, names=["Timestamp", "CPU Usage (%)", "Memory Usage", "Disk Usage (%)"]) # 将 DataFrame 写入 Excel 文件 df.to_excel(excel_file, index=False, engine='openpyxl') print(f"数据已成功保存为 Excel 文件:{excel_file}")
步骤 4:定时将 CSV 转换为 Excel 文件
你可以将上面的 Python 脚本放入一个单独的文件(例如 csv_to_excel.py
),并使用 cron
设置定时任务每分钟运行 Python 脚本。
-
编辑
crontab
文件:bashcrontab -e
-
添加一条新的
cron
任务,使其每分钟运行 Python 脚本:bash* * * * * /usr/bin/python3 /path/to/csv_to_excel.py
解释:
-
Shell 脚本:获取系统信息并每分钟将结果输出到 CSV 文件。
-
Python 脚本:定期将 CSV 文件转换为 Excel 文件,方便查看。
-
Cron 定时任务:确保每分钟执行一次上述任务。
完整流程:
-
每分钟,
system_usage.sh
脚本会执行,获取系统的 CPU、内存、磁盘使用情况,并将数据保存到system_usage.csv
文件中。 -
每分钟,
csv_to_excel.py
脚本会读取 CSV 文件,将其转换为 Excel 格式,并保存为system_usage.xlsx
。 -
结果保存后,你可以通过 Excel 查看每分钟的系统资源使用情况。
通过这种方式,你可以定期记录并保存服务器的性能数据。
#!/bin/bash # 获取当前时间 timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况 memory_usage=$(free -h | grep Mem | awk '{print \$3 "/" \$2}') # 获取磁盘使用情况 disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print \$5}' | head -n 1) # 输出 CSV 格式 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> /path/to/system_usage.csv #!/bin/bash # 获取当前时间 timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况 memory_usage=$(free -h | grep Mem | awk '{print \$3 "/" \$2}') # 获取磁盘使用情况 disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print \$5}' | head -n 1) # 输出 CSV 格式 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> /path/to/system_usage.csv #!/bin/bash # 设置 CSV 文件的路径(Excel 可以打开该格式) output_file="/path/to/system_usage.csv" # 检查 CSV 文件是否存在,如果不存在则写入表头 if [ ! -f "$output_file" ]; then echo "Timestamp,CPU Usage (%),Memory Usage,Disk Usage" > "$output_file" fi # 无限循环,每 10 分钟获取一次系统信息 while true; do # 获取当前时间(时间戳) timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况 memory_usage=$(free -h | grep Mem | awk '{print \$3 "/" \$2}') # 获取磁盘使用情况(根文件系统使用百分比) disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print \$5}' | head -n 1) # 输出数据到 CSV 文件 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> "$output_file" # 等待 10 分钟(600 秒) sleep 600 done #!/bin/bash # 设置 CSV 文件的路径(Excel 可以打开该格式) output_file="/path/to/system_usage.csv" # 检查 CSV 文件是否存在,如果不存在则写入表头 if [ ! -f "$output_file" ]; then echo "Timestamp,CPU Usage (%),Memory Usage,Disk Usage" > "$output_file" fi # 无限循环,每 10 分钟获取一次系统信息 while true; do # 获取当前时间(时间戳) timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') # 获取内存使用情况 memory_usage=$(free -h | grep Mem | awk '{print $3 "/" $2}') # 获取磁盘使用情况(根文件系统使用百分比) disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5}' | head -n 1) # 输出数据到 CSV 文件 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> "$output_file" # 等待 10 分钟(600 秒) sleep 600 done #!/bin/bash # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况 mem_total=$(free -h | grep Mem | awk '{print \$2}') mem_used=$(free -h | grep Mem | awk '{print \$3}') mem_free=$(free -h | grep Mem | awk '{print \$4}') # 输出结果 echo "CPU Usage: $cpu_usage%" echo "Total Memory: $mem_total" echo "Used Memory: $mem_used" echo "Free Memory: $mem_free" #!/bin/bash # 获取CPU使用情况 get_cpu_usage() { # 使用top命令获取CPU信息,并提取相关信息 cpu_info=$(top -bn1 | grep "Cpu(s)" | \ sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \ awk '{print 100 - $1"%"}') echo "CPU Usage: $cpu_info" } # 获取内存使用情况 get_memory_usage() { # 使用free命令获取内存信息,并提取相关信息 mem_info=$(free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }') echo "$mem_info" } # 主函数 main() { echo "System Resource Usage:" get_cpu_usage get_memory_usage } # 执行主函数 main #!/bin/bash # 设置 CSV 文件的路径(Excel 可以打开该格式) output_file="/path/to/system_usage.csv" # 检查路径是否存在,如果不存在则创建 output_dir=$(dirname "$output_file") if [ ! -d "$output_dir" ]; then echo "目录不存在,正在创建目录: $output_dir" mkdir -p "$output_dir" fi # 检查 CSV 文件是否存在,如果不存在则写入表头 if [ ! -f "$output_file" ]; then echo "Timestamp,CPU Usage (%),Memory Usage (Used/Total),Disk Usage (%)" > "$output_file" fi # 无限循环,每 10 分钟获取一次系统信息 while true; do # 获取当前时间(时间戳) timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 获取 CPU 使用情况 cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - \$1}') # 获取内存使用情况,格式化为 "Used/Total" memory_usage=$(free -h | grep Mem | awk '{print \$3 "/" \$2}') # 获取磁盘使用情况(根文件系统使用百分比),确保输出是数字格式(去除%符号) disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print \$5}' | head -n 1 | sed 's/%//') # 输出数据到 CSV 文件 echo "$timestamp,$cpu_usage,$memory_usage,$disk_usage" >> "$output_file" # 等待 10 分钟(600 秒) sleep 600 done