1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...-Go服务器开发" />

ZBLOG

#!/bin/sh # 输入文件 input_file="/proc/meminfo" # 输出文件 output_file="/mnt/userdata/memory_stats.csv" rss="/mnt/userdata/rss.txt" memorytype=`awk -F':' '{ printf "%s%s", (NR>1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...

你的脚本是一个用于监控系统内存使用情况的 Shell 脚本,主要功能包括:

  1. 获取内存信息:从 /proc/meminfo 文件中提取内存相关数据,并将其写入到 CSV 格式的输出文件中。

  2. 循环监测:脚本通过一个无限循环不断地读取内存信息,每20秒执行一次,并将结果追加到输出文件。

  3. 进程状态监测:使用 ps 命令来获取当前正在运行的进程及其 RSS(常驻集大小),并将该信息记录到另一个文件中。

  4. 条件判断:如果缓存内存(Cached)小于4000 KB,则会发送 SIGKILL 信号给名为 XGUI 的进程,并退出循环。此外,如果循环次数超过102400次,也会退出。

以下是对脚本的一些建议和改进点:

建议和改进

  1. 变量命名

    • 使用更具描述性的变量名称,例如 memory_infoprocess_info,以提高代码可读性。
  2. 错误处理

    • 在关键操作之后加入错误检查,例如在文件读写、命令执行后检查返回值,以确保操作成功。
  3. 避免硬编码的路径

    • 将输入输出路径作为参数传入,使得脚本更灵活,便于重用。
  4. 使用 $(( ... )) 替代 expr

    • 现代 Bash 提供了算术扩展,可以用 $((count + 1)) 替代 count=\expr $count + 1.
  5. 条件语句改进

    • 在比较字符串或数字时,可以加上引号,比如 [ "$mem" -lt 4000 ],以防止因未定义变量而导致的错误。

改写示例

下面是基于上述建议重构后的示例脚本:

  1. #!/bin/sh
  2. # 输入文件
  3. input_file="/proc/meminfo"
  4. # 输出文件
  5. output_file="/mnt/userdata/memory_stats.csv"
  6. rss="/mnt/userdata/rss.txt"
  7. # 提取内存类型
  8. awk -F':' '{ printf "%s%s", (NR>1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"
  9. if [ -f "$rss" ]; then
  10. rm "$rss"
  11. fi
  12. count=0
  13. while true; do
  14. # 使用awk提取数值并输出到文件
  15. memory_info=$(awk '
  16. {
  17. for (i = 1; i <= NF; i++) {
  18. if ($i ~ /^[0-9]+([.][0-9]+)?( kB| MB| GB| TB)?$/) {
  19. gsub(/[ kMGT]B?$/, "", $i)
  20. result = (NR > 1 ? result "," : "") result $i
  21. }
  22. }
  23. }
  24. END { print result }' "$input_file")
  25. echo "$memory_info" >> "$output_file"
  26. # 执行 ps 命令并将结果追加到文件中
  27. ps -eo pid,comm,rss | awk '$3 != 0' >> "$rss"
  28. mem=$(grep Cached: /proc/meminfo | awk '{print $2}')
  29. if [ "$mem" -lt 4000 ]; then
  30. echo "===== ${mem} ========"
  31. echo "I will kill XGUI -6"
  32. killall -6 XGUI || echo "Failed to kill XGUI."
  33. break
  34. fi
  35. count=$((count + 1))
  36. if [ $count -gt 102400 ]; then
  37. break
  38. fi
  39. sleep 20
  40. done

这些修改不仅使代码更加健壮,而且也提高了可读性与可维护性。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...">https://golang.0voice.com/?id=20559

分享:
扫描分享到社交APP
1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...&appkey=&pic=&searchPic=true")' title="分享到新浪微博" class="weibo"> 1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...")' title="分享到QQ好友" class="qq"> 1 ? "," : ""), $1 } END { print "" }' "$input_file" > "$output_file"`...")' title="分享到QQ空间" class="qqzone">
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?