监控方法
- 使用
time
命令:可以简单获取脚本执行的总时间。在脚本开头和结尾分别记录时间点,计算差值,能知道脚本整体执行耗时,但不能实时监控CPU和内存。
start_time=$(date +%s.%N)
# 这里是你的复杂Bash脚本内容
end_time=$(date +%s.%N)
elapsed_time=$(echo "$end_time - $start_time" | bc)
echo "脚本执行时间: $elapsed_time 秒"
- 使用
ps
命令:结合while
循环实时获取脚本进程的CPU和内存使用情况。假设脚本运行的进程ID为$pid
。
while true; do
cpu_usage=$(ps -p $pid -o %cpu | tail -n 1)
mem_usage=$(ps -p $pid -o %mem | tail -n 1)
echo "CPU使用率: $cpu_usage%, 内存使用率: $mem_usage%"
sleep 1 # 每秒监控一次
done
- 使用
top
或htop
:在另一个终端窗口中使用top
(标准Linux工具)或htop
(更友好的界面),通过按P
(top
中)根据CPU使用率排序,按M
根据内存使用率排序,找到脚本对应的进程观察其资源占用情况。
优化思路
- 减少循环次数:检查循环中是否有不必要的迭代,尽量提前结束循环。例如,在查找满足条件的元素时,一旦找到就退出循环。
for i in {1..100}; do
if [ $i -eq 50 ]; then
break
fi
# 其他操作
done
- 优化函数调用:避免在循环中频繁调用复杂函数。可以将函数计算结果缓存起来,在循环内直接使用缓存值。
function complex_function() {
# 复杂计算
result=$(echo "一些复杂运算" | bc)
echo $result
}
cached_result=$(complex_function)
for i in {1..10}; do
# 使用缓存结果
echo "使用缓存结果: $cached_result"
done
- 优化外部命令执行:尽量减少外部命令的调用次数。如果多个外部命令有类似功能,可以选择功能最全且资源消耗少的命令,或者合并多个外部命令为一个。例如,使用
xargs
将多个文件操作合并。
# 优化前
for file in *.txt; do
cat $file | grep "关键词"
done
# 优化后
find . -name "*.txt" -exec grep "关键词" {} +
- 释放内存:如果脚本中创建了大数组或变量占用大量内存,在使用完后及时释放。例如,将大数组设置为空。
big_array=(1 2 3 ... 100000)
# 使用数组
unset big_array