有人知道怎么用proc/diskstats统计硬盘使用率?

时间:2020-12-04 10:10:32
想做一个监控系统,已经搞定cpu \mem 了,不知道disk怎么计算了,
cpu 用的 /proc/stat
mem 用的 /proc/meminfo

16 个解决方案

#1


du 
df
都可以统计的啊,为什么非要用/proc

#2



#!/bin/sh
if [ $# -lt 1 ]
then
  echo "error_text=diskname argument not specified!"
  exit
fi

os=`uname`
diskname=$1
diskutil="5"
awk_cmd="awk"
disk_size=""
used=""
disk_size_mb="-1"
used_mb="-1"

#get pure disk name
which nawk > /dev/null 2>&1
if [ $? -eq 0 ]
then
    awk_cmd="nawk"
fi
tempfile=`echo $diskname|$awk_cmd '{gsub("/",""); print $0}'`
tempfile="disk_$tempfile.temp"

if [ "$os" = "linux" ] || [ "$os" = "Linux" ]
then
  df $diskname >$tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    rm $tempfile
    exit 0
  fi
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$5)}'|awk '{gsub("%",""); print $0}'`
  disk_size=`cat $tempfile |tail -1 | awk '{print $2}'`
  disk_size_mb=`expr $disk_size / 1024`
  disk_size=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$disk_size_mb`
  disk_size="${disk_size}GB"

  used=`cat $tempfile |tail -1 | awk '{print $3}'`
  used_mb=`expr $used / 1024`
  used=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$used_mb`
  used="${used}GB"


elif [ "$os" = "SunOS" ]
then
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  diskutil=`cat $tempfile |tail -1 | awk '{print $5}' | cut -f1 -d %`
  disk_size=`cat $tempfile |tail -1 | awk '{print $2}'`
  disk_size_mb=`expr $disk_size / 1024`
  disk_size=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$disk_size_mb`
  disk_size="${disk_size}GB"


  used=`cat $tempfile |tail -1 | awk '{print $3}'`
  used_mb=`expr $used / 1024`
  used=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$used_mb`
  used="${used}GB"



elif [ "$os" = "HP-UX" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$1)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "SCO_SV" ] || [ "$os" = "UnixWare" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$4)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "OSF1" ]
then
  df $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$5)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "AIX" ] || [ "$os" = "aix" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$4)}'|awk '{gsub("%"," "); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

else 
  echo "error_text=Unsupported platform: $os"
  exit
fi

rm $tempfile
avail_mb=`expr $disk_size_mb - $used_mb`
avail=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$avail_mb`
avail="${avail}GB"
echo "Disk Utilization=${diskutil}"
echo "Total Size=$disk_size_mb"
echo "Used Size=$used_mb"
echo "Avail Size=$avail_mb"


直接给你一个

#3



#!/bin/sh
os=`uname`

if [ "$os" = "linux" ] || [ "$os" = "Linux" ]
then
  df -k | awk '{ print $1 ";" $6 ";" $2 }'
elif [ "$os" = "SunOS" ]
then
  df -k |more | awk '{ print $1 ";" $6 ";" $2 }'
elif [ "$os" = "HP-UX" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "SCO_SV" ] || [ "$os" = "UnixWare" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "OSF1" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "AIX" ] || [ "$os" = "aix" ]
then
  df -k | awk '{ print $1 ";" $7 }'
else 
  df -k | awk '{ print $1 ";" $6 }'
fi
exit


再来一个,我在linuxtone上下载的

#4


看看iostat这个命令的源码吧 是用c语言写的 但是也是去读取/proc/partitions /proc/diskstats /proc/cpuinfo的值 然后分析结果的
源码在这里 http://www.linuxinsight.com/files/iostat-2.2.tar.gz
包括注释 一共563行代码

#5


呵呵……,谢谢上面的回复的人,我是在用PHP 写一个监控程序,在中心监控下面的服务器(N个),就是不知道
硬盘是怎么写的,proc下面的数据看着火大呀。

#6


我现在直接用df 在程序得到的结果,感觉应该用diskstat文件来分析好一些,

#7


引用 5 楼 llj480028 的回复:
呵呵……,谢谢上面的回复的人,我是在用PHP 写一个监控程序,在中心监控下面的服务器(N个),就是不知道
硬盘是怎么写的,proc下面的数据看着火大呀。

那个c语言的程序 就是读取的/proc下的文件的信息
你看看他怎么分析的  那些数字是哪些意思  然后用php同样读取该文件 同样读取同样位置的数据进行处理啊。

再说了 监控服务器有现成的Nagios和Cacti 这2个合起来用就非常happy了  自己扩展功能也容易  干嘛还要自己去写!

#8


因为是在我们系统架构上,写一个功能,所以自己好一些,

#9


用命令df加sed awk什么的挺好的

#10


引用 9 楼 lgxwqq111 的回复:
用命令df加sed awk什么的挺好的

是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了

#11


是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了
----------------------
那你直接就用iostat这个命令呀!
他已经把硬盘使用率等等统计出来了 你直接截取你要的结果就行了啊!

#12


引用 11 楼 steptodream 的回复:
是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了
----------------------
那你直接就用iostat这个命令呀!
他已经把硬盘使用率等等统计出来了 你直接截取你要的结果就行了啊!


嗯,cpu和mem是自己分析的,然后搞了一上午disk,还没搞明白,就直接用的df把数据全部在页面展示了,这么做还简单些。

#13


所以 一样 你可以把iostat的结果显示到界面上  
看的人一看就明白了

#14


我的这个做的复杂一些,不知道有没有参考价值

http://topic.csdn.net/u/20101206/00/fe88806e-7de0-4b6a-af04-5eccf22c9ee5.html?14161

#15


系统监控直接用开源软件monit就可以了,没必要自己去重新造*

#16


引用 14 楼 yui 的回复:
我的这个做的复杂一些,不知道有没有参考价值

http://topic.csdn.net/u/20101206/00/fe88806e-7de0-4b6a-af04-5eccf22c9ee5.html?14161

我在想可不可以用C做一个方法,把cpu、mem、disk使用率统计出来就是要自己写个top 了,然后在php中打包成.so文件那就相当于用php语言的一个方法了。

#1


du 
df
都可以统计的啊,为什么非要用/proc

#2



#!/bin/sh
if [ $# -lt 1 ]
then
  echo "error_text=diskname argument not specified!"
  exit
fi

os=`uname`
diskname=$1
diskutil="5"
awk_cmd="awk"
disk_size=""
used=""
disk_size_mb="-1"
used_mb="-1"

#get pure disk name
which nawk > /dev/null 2>&1
if [ $? -eq 0 ]
then
    awk_cmd="nawk"
fi
tempfile=`echo $diskname|$awk_cmd '{gsub("/",""); print $0}'`
tempfile="disk_$tempfile.temp"

if [ "$os" = "linux" ] || [ "$os" = "Linux" ]
then
  df $diskname >$tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    rm $tempfile
    exit 0
  fi
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$5)}'|awk '{gsub("%",""); print $0}'`
  disk_size=`cat $tempfile |tail -1 | awk '{print $2}'`
  disk_size_mb=`expr $disk_size / 1024`
  disk_size=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$disk_size_mb`
  disk_size="${disk_size}GB"

  used=`cat $tempfile |tail -1 | awk '{print $3}'`
  used_mb=`expr $used / 1024`
  used=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$used_mb`
  used="${used}GB"


elif [ "$os" = "SunOS" ]
then
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  diskutil=`cat $tempfile |tail -1 | awk '{print $5}' | cut -f1 -d %`
  disk_size=`cat $tempfile |tail -1 | awk '{print $2}'`
  disk_size_mb=`expr $disk_size / 1024`
  disk_size=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$disk_size_mb`
  disk_size="${disk_size}GB"


  used=`cat $tempfile |tail -1 | awk '{print $3}'`
  used_mb=`expr $used / 1024`
  used=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$used_mb`
  used="${used}GB"



elif [ "$os" = "HP-UX" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$1)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "SCO_SV" ] || [ "$os" = "UnixWare" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$4)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "OSF1" ]
then
  df $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$5)}'|awk '{gsub("%"," "); print $0}'`
  diskutil=`echo $diskutil|awk '{gsub(" ",""); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

elif [ "$os" = "AIX" ] || [ "$os" = "aix" ]
then
  #df -k $diskname > /dev/null
  df -k $diskname > $tempfile
  if [ $? -ne 0 ]
  then
    echo "error_text=$diskname not found"
    exit 0
  fi
  #temp=`df -k $diskname |tail -1`
  temp=`cat $tempfile |tail -1`
  diskutil=`echo $temp|awk '{printf("%s",$4)}'|awk '{gsub("%"," "); print $0}'`
  echo "Disk Utilization=${diskutil}"
  echo "Total Size=-1"
  echo "Used Size=-1"
  echo "Avail Size=-1"
  echo "status_text=Disk Utilization: {0}%;;;${diskutil}"
  exit

else 
  echo "error_text=Unsupported platform: $os"
  exit
fi

rm $tempfile
avail_mb=`expr $disk_size_mb - $used_mb`
avail=`echo | awk '{ printf("%.2f",(c1/1024.0)) }' c1=$avail_mb`
avail="${avail}GB"
echo "Disk Utilization=${diskutil}"
echo "Total Size=$disk_size_mb"
echo "Used Size=$used_mb"
echo "Avail Size=$avail_mb"


直接给你一个

#3



#!/bin/sh
os=`uname`

if [ "$os" = "linux" ] || [ "$os" = "Linux" ]
then
  df -k | awk '{ print $1 ";" $6 ";" $2 }'
elif [ "$os" = "SunOS" ]
then
  df -k |more | awk '{ print $1 ";" $6 ";" $2 }'
elif [ "$os" = "HP-UX" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "SCO_SV" ] || [ "$os" = "UnixWare" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "OSF1" ]
then
  df -k | awk '{ print $1 ";" $6 }'
elif [ "$os" = "AIX" ] || [ "$os" = "aix" ]
then
  df -k | awk '{ print $1 ";" $7 }'
else 
  df -k | awk '{ print $1 ";" $6 }'
fi
exit


再来一个,我在linuxtone上下载的

#4


看看iostat这个命令的源码吧 是用c语言写的 但是也是去读取/proc/partitions /proc/diskstats /proc/cpuinfo的值 然后分析结果的
源码在这里 http://www.linuxinsight.com/files/iostat-2.2.tar.gz
包括注释 一共563行代码

#5


呵呵……,谢谢上面的回复的人,我是在用PHP 写一个监控程序,在中心监控下面的服务器(N个),就是不知道
硬盘是怎么写的,proc下面的数据看着火大呀。

#6


我现在直接用df 在程序得到的结果,感觉应该用diskstat文件来分析好一些,

#7


引用 5 楼 llj480028 的回复:
呵呵……,谢谢上面的回复的人,我是在用PHP 写一个监控程序,在中心监控下面的服务器(N个),就是不知道
硬盘是怎么写的,proc下面的数据看着火大呀。

那个c语言的程序 就是读取的/proc下的文件的信息
你看看他怎么分析的  那些数字是哪些意思  然后用php同样读取该文件 同样读取同样位置的数据进行处理啊。

再说了 监控服务器有现成的Nagios和Cacti 这2个合起来用就非常happy了  自己扩展功能也容易  干嘛还要自己去写!

#8


因为是在我们系统架构上,写一个功能,所以自己好一些,

#9


用命令df加sed awk什么的挺好的

#10


引用 9 楼 lgxwqq111 的回复:
用命令df加sed awk什么的挺好的

是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了

#11


是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了
----------------------
那你直接就用iostat这个命令呀!
他已经把硬盘使用率等等统计出来了 你直接截取你要的结果就行了啊!

#12


引用 11 楼 steptodream 的回复:
是呀,我硬盘统计就直接用df命令,其它的两个参数,全是分析的文件,这个DISKSTATS 太不好搞了
----------------------
那你直接就用iostat这个命令呀!
他已经把硬盘使用率等等统计出来了 你直接截取你要的结果就行了啊!


嗯,cpu和mem是自己分析的,然后搞了一上午disk,还没搞明白,就直接用的df把数据全部在页面展示了,这么做还简单些。

#13


所以 一样 你可以把iostat的结果显示到界面上  
看的人一看就明白了

#14


我的这个做的复杂一些,不知道有没有参考价值

http://topic.csdn.net/u/20101206/00/fe88806e-7de0-4b6a-af04-5eccf22c9ee5.html?14161

#15


系统监控直接用开源软件monit就可以了,没必要自己去重新造*

#16


引用 14 楼 yui 的回复:
我的这个做的复杂一些,不知道有没有参考价值

http://topic.csdn.net/u/20101206/00/fe88806e-7de0-4b6a-af04-5eccf22c9ee5.html?14161

我在想可不可以用C做一个方法,把cpu、mem、disk使用率统计出来就是要自己写个top 了,然后在php中打包成.so文件那就相当于用php语言的一个方法了。