Shell脚本问题:无法将top命令输出写入cpu.csv与mem.csv
脚本错误排查与修复
你的脚本存在几个关键问题,导致目标文件无法生成:
1. 后台运行top且未传递输出
你用top -b -n 1 &让top在后台执行,后续的grep命令没有从top的输出中读取内容,而是会一直等待用户输入,脚本卡在这一步,自然无法生成csv文件。
2. 缺少管道连接top与grep
要提取top的输出内容,必须通过管道(|)将top的输出直接传递给grep,而非分开执行命令。
修复后的脚本
推荐使用单次top执行+批量处理的方式,避免两次执行top导致时间戳与数据不匹配:
#!/bin/bash # 获取当前时间戳,确保和top采集时间一致 TIMESTAMP=$(date +"%Y-%m-%d-%H:%M:%S") # 执行top并通过管道批量提取所需行,再写入文件 top -b -n 1 | { CPU_LINE=$(grep "Cpu(s)") MEM_LINE=$(grep "KiB Mem") echo "$TIMESTAMP,$CPU_LINE" >> cpu.csv echo "$TIMESTAMP,$MEM_LINE" >> mem.csv }
如果需要分开执行top(效率稍低),也可以用以下写法:
#!/bin/bash TIMESTAMP=$(date +"%Y-%m-%d-%H:%M:%S") CPU_LINE=$(top -b -n 1 | grep "Cpu(s)") MEM_LINE=$(top -b -n 1 | grep "KiB Mem") echo "$TIMESTAMP,$CPU_LINE" >> cpu.csv echo "$TIMESTAMP,$MEM_LINE" >> mem.csv
额外提示
- 若你的系统中
top的内存行显示为MiB Mem而非KiB Mem,需要调整grep的匹配字符串。
内容的提问来源于stack exchange,提问作者user22672115
相关产品推荐
相关产品推荐

