首页 > 系统相关 >统计进程内存使用量

统计进程内存使用量

时间:2024-09-29 16:14:01浏览次数:1  
标签:MEM 使用量 内存 进程 TOTAL SIZE

统计进程内存使用量

#!/bin/bash

# 文件名: memory_show.sh
# 作者: wanghongwei
# 日期: 2024年9月29日
# 版本: 1.0
# 描述: 统计进程内存使用量
# 使用方式: ./memory_show.sh [-k/-K] [-m/-M] [-g/-G]

# 初始化所有进程的统计变量
declare -A TOTAL_MEM_SIZE

TOTAL_MEM_SIZE[KB]=0
TOTAL_MEM_SIZE[MB]=0
TOTAL_MEM_SIZE[GB]=0

Usage() {
  echo "Usage: $0 [-k/-K] [-m/-M] [-g/-G] <参数错误,请指定您想要显示的单位>"
  exit 1
}

Title() {
  echo "+----------+----------------------+"
  printf "| %-8s | %-20s |\n" \
    "PID" \
    "Total Memory ($1)"
  echo "+----------+----------------------+"
}

GetMemory() {
  # 获取进程的内存信息
  PROCESS_MEM_INFO=$(cat /proc/${PID}/smaps 2>/dev/null | grep -v " 0 kB" | grep "Rss")

  while read line; do
    if [[ $line =~ ^Rss:[[:space:]]+([0-9]+) ]]; then
          PAGE_SIZE=${BASH_REMATCH[1]}  # BASH_REMATCH[1] 包含第一个括号中匹配的内容
          PROCESS_MEM_TOTAL[KB]=$((PROCESS_MEM_TOTAL[KB] + PAGE_SIZE))
      fi
  done <<< "$PROCESS_MEM_INFO"

  # 累加全局统计
  TOTAL_MEM_SIZE[KB]=$((TOTAL_MEM_SIZE[KB] + PROCESS_MEM_TOTAL[KB]))
}

ShowMemory() {
  for PID in /proc/[0-9]*; do
    PID=${PID##*/}
    # 初始化单个进程的统计变量
    declare -A PROCESS_MEM_TOTAL

    PROCESS_MEM_TOTAL[KB]=0
    PROCESS_MEM_TOTAL[MB]=0
    PROCESS_MEM_TOTAL[GB]=0

    # 获取单个进程的内存总量
    GetMemory

    # 单位换算
    case "$1" in
      "KB") : ;;
      "MB") PROCESS_MEM_TOTAL[MB]=$(echo "scale=3; ${PROCESS_MEM_TOTAL[KB]} / 1024" | bc) ;;
      "GB") PROCESS_MEM_TOTAL[GB]=$(echo "scale=6; ${PROCESS_MEM_TOTAL[KB]} / 1024 / 1024" | bc) ;;
      *) : ;;
    esac

    # 如果进程使用了内存,则打印
    if [[ ${PROCESS_MEM_TOTAL[KB]} -gt 0 ]]; then
      printf "| %-8s | %-20s |\n" \
        "${PID}" \
        "${PROCESS_MEM_TOTAL[$1]} $1"
    fi
  done
}

Summary() {
  # 单位换算
  case "$1" in
    "KB") : ;;
    "MB") TOTAL_MEM_SIZE[MB]=$(echo "scale=3; ${TOTAL_MEM_SIZE[KB]} / 1024" | bc) ;;
    "GB") TOTAL_MEM_SIZE[GB]=$(echo "scale=6; ${TOTAL_MEM_SIZE[KB]} / 1024 / 1024" | bc) ;;
    *) : ;;
  esac

  # 打印总统计
  echo "+----------+----------------------+"
  printf "| %-8s | %-20s |\n" \
    "Total:" \
    "${TOTAL_MEM_SIZE[$1]} $1"
  echo "+----------+----------------------+"
}

main() {
  if [ -z "$1" ]; then
    Usage
  fi

  case "$1" in
    -k|-K) Title KB; ShowMemory KB; Summary KB ;;
    -m|-M) Title MB; ShowMemory MB; Summary MB ;;
    -g|-G) Title GB; ShowMemory GB; Summary GB ;;
    *) Usage ;;
  esac
  exit 0
}

main $1

标签:MEM,使用量,内存,进程,TOTAL,SIZE
From: https://www.cnblogs.com/wanghongwei-dev/p/18440249

相关文章

  • 动态内存分配——C语言
    本篇文章是对动态内存分配部分内容的学习分享,包含了四个内存函数的接受奥与使用以及常见的一些错误那咱们废话不多说,直接开始吧!1.动态内存功能存在的意义说到内存开辟也许我们并不能马上做出反应且清楚得知道指的是什么事实上,我们已经掌握了内存开辟方法了只是我们对这个......
  • 刘某的linux进程管理知识分享
    一、进程的基本概念1、进程和程序        程序是存储在磁盘上的可执行文件,当程序被加载到内存中开始运行时就被称为进程,一个程序可以被多次加载为很多个进程,进程就是处于活动状态的程序。2、进程的分类    进程一般分为三个种类:交互进程、批处理进程、守护......
  • 使用MessagePipe实现进程间通信
    使用MessagePipe实现进程间通信 1、MessagePipe介绍可以用于.NET和Unity上面的高性能的内存/分布式消息传递管道。适用于发布/订阅模式、CQRS的中介模式、Prism中的EventAggregator、IPC(进程间通信)-RPC等。支持:依赖注入过滤器管道更好的事件同步/异步带键值的/无键值......
  • java 17 查看 运行时内存堆 的命令
    Java17Windows11- 发生问题运行了一个java程序,基于Java17的。在使用jmap查看堆内存分配时,出现了错误:>jmap-heap8400Error:-heapoptionusedCannotconnecttocoredumporremotedebugserver.Usejhsdbjmapinstead提示使用jhsdbjamp替代。ben......
  • 进程和线程的区别和联系
    什么是进程(process)每个应⽤程序运⾏于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运⾏,所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之⼀。进程是操作系统对⼀......
  • 七种有效方法,轻松解决C盘内存爆满问题
    七种有效方法,轻松解决C盘内存爆满问题在我们日常电脑的使用中,C盘内存爆满是一个常见且令人头疼的问题。由于电脑运行产生的临时文件、软件下载及安装位置默认在C盘、系统更新后的文件占用大量空间等因素,导致C盘空间捉襟见肘。为了电脑能够流畅稳定运行,本文精心整理了七种清......
  • 计算机内存管理模块源码实现
    计算机内存管理模块的源码实现涉及到底层的操作系统内核编程,通常需要使用C语言或者汇编语言来编写。以下是一个简化的内存管理模块的伪代码示例,它展示了内存分配和释放的基本逻辑。这个例子非常基础,实际的内存管理模块会更加复杂,需要考虑诸如内存碎片、多线程同步等问题。#......
  • C语言-动态内存管理(malloc、calloc、realloc)
    目录1.内存布局2.动态内存函数2.1malloc2.1.1malloc是什么2.1.2如何用​编辑2.2free2.2.1free是什么2.2.2如何用2.3calloc2.3.1calloc是什么2.4realloc2.4.1realloc是什么2.4.2realloc如何使用2.4.3realloc可以实现与malloc同样的功能3.常见的动态......
  • 【C++】内存管理:内存分布、new/delete
        本篇主要介绍一下C++的内存管理相关知识。C++的内存管理和C语言保持一致。 1.C/C++内存分布一个程序的数据存储是需要分区的。常见的内存区域划分如下。我们学C++主要了解栈,堆,数据段,代码段。我们先看下面代码和相关问题。intglobalvar=1;staticintst......
  • 【专题】新能源发电行业及其市场化进程概览白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37802随着中国经济结构的持续优化以及能源政策的不断进步,我国的能源消费呈现出稳定增长的态势。与此同时,能源利用效率逐步提高,清洁能源在能源结构中的比例也在稳步上升,这为国家的可持续发展战略提供了有力的支撑。文末204份电力行业研究报告最新趋......