你的脚本是一个用于监控系统内存使用情况的 Shell 脚本,主要功能包括:
获取内存信息:从
/proc/meminfo
文件中提取内存相关数据,并将其写入到 CSV 格式的输出文件中。循环监测:脚本通过一个无限循环不断地读取内存信息,每20秒执行一次,并将结果追加到输出文件。
进程状态监测:使用
ps
命令来获取当前正在运行的进程及其 RSS(常驻集大小),并将该信息记录到另一个文件中。条件判断:如果缓存内存(Cached)小于4000 KB,则会发送 SIGKILL 信号给名为
XGUI
的进程,并退出循环。此外,如果循环次数超过102400次,也会退出。
以下是对脚本的一些建议和改进点:
建议和改进
变量命名:
- 使用更具描述性的变量名称,例如
memory_info
和process_info
,以提高代码可读性。
- 使用更具描述性的变量名称,例如
错误处理:
- 在关键操作之后加入错误检查,例如在文件读写、命令执行后检查返回值,以确保操作成功。
避免硬编码的路径:
- 将输入输出路径作为参数传入,使得脚本更灵活,便于重用。
使用
$(( ... ))
替代expr
:- 现代 Bash 提供了算术扩展,可以用
$((count + 1))
替代count=\expr $count + 1
.
- 现代 Bash 提供了算术扩展,可以用
条件语句改进:
- 在比较字符串或数字时,可以加上引号,比如
[ "$mem" -lt 4000 ]
,以防止因未定义变量而导致的错误。
- 在比较字符串或数字时,可以加上引号,比如
改写示例
下面是基于上述建议重构后的示例脚本:
#!/bin/sh
# 输入文件
input_file="/proc/meminfo"
# 输出文件
output_file="/mnt/userdata/memory_stats.csv"
rss="/mnt/userdata/rss.txt"
# 提取内存类型
awk -F':' '{ printf "%s%s", (NR>1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"
if [ -f "$rss" ]; then
rm "$rss"
fi
count=0
while true; do
# 使用awk提取数值并输出到文件
memory_info=$(awk '
{
for (i = 1; i <= NF; i++) {
if ($i ~ /^[0-9]+([.][0-9]+)?( kB| MB| GB| TB)?$/) {
gsub(/[ kMGT]B?$/, "", $i)
result = (NR > 1 ? result "," : "") result $i
}
}
}
END { print result }' "$input_file")
echo "$memory_info" >> "$output_file"
# 执行 ps 命令并将结果追加到文件中
ps -eo pid,comm,rss | awk '$3 != 0' >> "$rss"
mem=$(grep Cached: /proc/meminfo | awk '{print $2}')
if [ "$mem" -lt 4000 ]; then
echo "===== ${mem} ========"
echo "I will kill XGUI -6"
killall -6 XGUI || echo "Failed to kill XGUI."
break
fi
count=$((count + 1))
if [ $count -gt 102400 ]; then
break
fi
sleep 20
done
这些修改不仅使代码更加健壮,而且也提高了可读性与可维护性。
内容由零声教学AI助手提供,问题来源于学员提问