#!/bin/bash
while true; do
grep -oE '[0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%)' monitor.log | \
cut -d ' ' -f 2,1,5 >> high_mem_usage.log
sleep 1
done
脚本优化思路
- 减少文件I/O操作:目前脚本每次检测到符合条件的进程就追加写入文件,可考虑先在内存中缓存符合条件的数据,比如使用数组。当缓存达到一定数量(例如100条)或者经过一段时间(例如10秒),再批量写入文件。这样可以减少文件I/O的频率,降低系统资源消耗。
- 优化grep命令:
grep
命令目前是在整个日志文件中搜索,若日志文件很大,效率较低。可以结合tail -f
命令只监控日志文件新增的内容,这样可以避免重复搜索已经处理过的日志行。例如:tail -f monitor.log | grep -oE '[0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%)'
。
- 减少不必要的命令执行:
cut
命令每次执行也会消耗一定资源,可以在grep
的正则表达式匹配时,直接提取需要的字段,避免使用cut
。例如:grep -oE '([0-9]+\s+[0-9]+\s+\S+\s+[0-9]+%\s+([89][0-9]%|100%))' monitor.log
,然后对匹配到的内容进行适当处理获取对应字段。