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 ],以防止因未定义变量而导致的错误。

改写示例

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

#!/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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处: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

注册

已经有帐号?