Shared Memory Framework for Native\Code Samples\SMCoreTempCPPReader中,附带一个命令行方式下采集cpu温度的项目。
其原理是coretemp开放一个共享内存对象,SMCoreTempCPPReader打开该对象,读取coretemp获取的温度值。
使用vs2008打开该项目,对其进行适当修改,实现输出一个温度值的目的。
修改后的代码如下:
#include "stdafx.h"
#include "SMCoreTempCPPReader.h"
#include "GetCoreTempInfo.h"
int _tmain(int argc, _TCHAR* argv[])
{
ULONG index;
CoreTempProxy coreTempProxy;
if (coreTempProxy.GetData())
{
if(coreTempProxy.IsFahrenheit()) perror("error1");//是华氏温度,报错,希望是摄氏温度
float sum = 0;
int num = 0;
//遍历所有cpu
for (UINT i = 0; i < coreTempProxy.GetCPUCount(); i++)
{
//遍历所有核
for (UINT g = 0; g < coreTempProxy.GetCoreCount(); g++)
{
num ++;
index = g + (i * coreTempProxy.GetCoreCount());
if (coreTempProxy.IsDistanceToTjMax())
{
perror("error2");
}
else
{
sum += coreTempProxy.GetTemp(index);//累计温度
}
}
}
printf("%d",(int)sum/num);//计算平均值
}
else
{
printf("error3");//其他错误
}
return 0;
}
在服务器上启动coretemp,运行程序是否正常输出温度。
根据下面的文章在在服务器上安装snmptools
利用snmptools实现cacti自定义监控Windows性能计数器
将SMCoreTempCPPReader.exe,GetCoreTempInfo.dll,msvcr100d.dll复制到服务器的windows目录下
编辑c:\counters.ini
输入
[1.3.6.1.4.1.15.1]
type=exec
counter=SMCoreTempCPPReader.exe
重启snmp服务,找一台linux机器,使用snmpwalk -c xxxx -v1 a.b.c.d 1.3.6.1.4.1.15.1测试能否获取温度值.
本人测试的时候,一直报错error3,几经试验,找到部分原因:
coretemp运行中administrator用户下,snmptools启动SMCoreTempCPPReader.exe是在system用户下,无法打开coretemp开放的
使用sysinternals工具中的psexec,获取运行在system用户下的cmd窗口。
psexec -s cmd
在该窗口中重新运行coretemp程序,使用snmpwalk就能获取温度值了。
在cacti里创建data模块cpu temp,oid栏中填.1.3.6.1.4.1.15.1,再创建graph模板,最后应用到服务器上。
下一步就是创建thold监控,当温度高于一定值时,发送邮件到手机上,前提是要开通139邮箱,允许短信通知。
详细的步骤就不罗嗦了。