客户端脚本:
端脚本:
- - coding:utf-8 - -import io
import os
import sys
import time
import datetime
import socket
import commands
import logging
from logging import handlers
import psutil
import struct
import fcntl
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
class logger(object):
level_relations = {
'debug': logging.debug,
'info': logging.info,
'warning': logging.warning,
'error': logging.error,
'crit': logging.critical
} # 日志级别关系映射
def init (self,logname, level='info', when='d', backcount=10, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
current_dir = os.path.dirname(file)
log_file = os.path.abspath(os.path.join(current_dir, logname))
self.logger = logging.getlogger(log_file)
format_str = logging.formatter(fmt) # 设置日志格式
self.logger.setlevel(self.level_relations.get(level)) # 设置日志级别
sh = logging.streamhandler() # 往屏幕上输出
sh.setformatter(format_str) # 设置屏幕上显示的格式
th = handlers.timedrotatingfilehandler(
filename=log_file, when=when, backupcount=backcount, encoding='utf-8') # 往文件里写入#指定间隔时间自动生成文件的处理器
#实例化timedrotatingfilehandler
#interval是时间间隔,backupcount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
s 秒m 分h 小时、d 天、w 每星期(interval==0时代表星期一)midnight 每天凌晨th.setformatter(format_str) # 设置文件里写入的格式
#self.logger.addhandler(sh) # 把对象加到logger里
if not self.logger.handlers:
self.logger.addhandler(th)
class clientmonitor(object):
#获取指定网卡ip
def getipaddress(self,dev):
s = socket.socket(socket.af_inet, socket.sock_dgram)
a = s.fileno()
b = 0x8915
c = struct.pack('256s', dev[:15])
res = fcntl.ioctl(a, b, c)[20:24]
return socket.inet_ntoa(res)
#获取网络的使用情况 ,取的是eth0的发送和收取的总字节数
#readnetinfo('eth0')
def readnetinfo(self,dev):
f = open('/proc/net/dev')
lines = f.readlines()
f.close()
res = {'in':0, 'out':0}
for line in lines:
if line.lstrip().startswith(dev):
for centosline = line.replace(':', ' ')
items = line.split()
res['in'] = long(items[1])#/1024
res['out'] = long(items[len(items)/2 + 1])#/1024
return res
def readnetinfo_new(self,dev):
res = {'in':0, 'out':0}
res['in'] = psutil.net_io_counters(pernic=true).get(dev).bytes_recv
res['out'] = psutil.net_io_counters(pernic=true).get(dev).bytes_sent
return res
#磁盘使用率,path:磁盘路径
def disk_stat(self,path):
hd={}
disk = os.statvfs(path)
percent = (disk.f_blocks - disk.f_bfree) * 100 / (disk.f_blocks -disk.f_bfree + disk.f_bavail) + 1
return percent
def net_loop(self,dev):
#end = {'in':0, 'out':0}
res = self.readnetinfo_new(dev)
#推迟执行的秒数
time.sleep(2)
#new_recv,new_send = get_net_data()
new_res = self.readnetinfo_new(dev)
recv_data = (new_res['in']-res['in'])/1024/1024
send_data = (new_res['out']-res['out'])/1024/1024
print (recv_data: %s m, send_data: %s m%(recv_data, send_data))
return recv_data,send_data
def processcheck(self,cmd):
#cmd='ps -aux | sort -k3nr | head -1'
(status,output) = commands.getstatusoutput(cmd)
#pid= output.split(' ')[6]
log.logger.info('资源占用top:\\n'+output)
#查看占用内存最高的进程的pid
#ps aux|head -1;ps aux|grep -v pid|sort -rn -k +4|head
#ps -aux | sort -k4nr | head -1 ,-k3 cpu占用最高,-k4 内存占用最高
#root 14668 1.9 0.0 90504 3256 ? ss 4月23 2811:48 /sbin/rngd -f
#索引:-k3 b.split(' ')[6] 28进程路径(/sbin/rngd)
#索引:-k4 b.split(' ')[4]
if name == main :
#10分钟执行一次,数据上报到服务端,服务端负责报警
#需要修改的参数:custom,devicetype,netname
custom ='test'
devicetype ='客户端服务器'
#网卡名称
netname = 'ens3f0'
log = logger('socketclient.logs')
log.logger.info(----start----)
info=clientmonitor()
locatip = info.getipaddress(netname)
recv_data,send_data = info.net_loop(netname)
cpuinfo = psutil.cpu_percent(1)
#svmem(total=67268558848, available=32022245376, percent=52.4, used=34601009152, free=29655695360, active=17274105856, inactive=2927910912, buffers=10100736, cached=3001753600, shared=298610688, slab=11243315200)
svmem = psutil.virtual_memory()
meminfo = svmem[2]
disk_root = info.disk_stat('/')
disk_appslog = info.disk_stat('/appslog')
disk_bigdata = info.disk_stat('/bigdata')
#如果cpu或内存的占用率大于80%,将占用cpu或内存资源最多的进程找出来
issendmsg =1
if(cpuinfo>80 or meminfo>80 or disk_root>80 or disk_appslog>80 or disk_bigdata>80 or recv_data>3000 or send_data>3000):
#发送预警邮件
sendmsg=locatip +' 服务器资源占用高!请检查!\\n'
sendmsg += cpu占用:+str(cpuinfo)+'\\n'
sendmsg += 内存占用:+str(meminfo)+'\\n'
sendmsg += /目录占用:+str(disk_root)+'\\n'
sendmsg += /appslog目录占用:+str(disk_appslog)+'\\n'
sendmsg += /bigdata目录占用:+str(disk_bigdata)+'\\n'
sendmsg += 网卡接收流量:+str(recv_data)+'m,发送流量 '+str(send_data)+'m \\n'
#sendmsg += 网卡10秒发送流量:+str(send_data)+'\\n'
log.logger.info(sendmsg)
if cpuinfo>80 :
info.processcheck('ps -aux | sort -k3nr | head -10')
if meminfo>80 :
info.processcheck('ps -aux | sort -k4nr | head -10')
issendmsg = 1
else:
#log.logger.info(locatip+ 正常)
log.logger.info(cpu使用率:+str(cpuinfo))
log.logger.info(内存使用率:+str(meminfo))
log.logger.info(/目录使用率:+str(disk_root))
log.logger.info(/appslog使用率:+str(disk_appslog))
log.logger.info(/bigdata使用率:+str(disk_bigdata))
log.logger.info(网卡接收和发送情况:接收+str(recv_data) +m, 发送 +str(send_data)+m)
#id,custom,devicetype,ip,cpu,mem,disk_root,disk_appslog,disk_bigdata,networkrecv,networksend,uploadtime,temp2,temp3,temp4
msg = '1'+'|'+custom+'|'+devicetype+'|'+locatip+'|'+str(cpuinfo)+'|'+str(meminfo)+'|'+str(disk_root)+'|'+str(disk_appslog)+'|'+str(disk_bigdata)+'|'+str(recv_data)+'|'+str(send_data)+'|'+time.strftime(%y-%m-%d %h:%m:%s, time.localtime())
if issendmsg ==1:
ip_port = ('ip',port)
sk = socket.socket()
sk.connect(ip_port)
sk.sendall(msg)
data = sk.recv(1024)
if data=='1':
log.logger.info(本地预警信息传输成功!)
else:
log.logger.info(本地预警信息传输失败!)
sk.sendall('exit')
sk.close()
原文链接:https://blog.csdn.net/eagle89/article/details/128579002
Skyworks上季度营收12.19亿美元,预计下季度营收11.75至12.25亿美元
RK3568/RK3588开发板人工智能AI摄像头识别功能方案
PCB拼板技巧记录
科大讯飞上半年营收同期增长2.86%%,To C业务实现营收16.35亿元
工业安全用电监测与智慧能源解决方案
监控服务器资源利用率的客户端脚本
山东移动携手华为实现了负500米矿井的5G全覆盖
PI推出LinkZero-AX系列器件LNK585和LNK586
国家电网把确保电网安全运行和可靠供电作为重中之重
SiC FET神应用,在各种领域提高功率转换效率
MCU 解决工业自动化和 IIoT 挑战
射频电路PCB设计的流程及注意事项
受日韩贸易战影响,日本半导体订单额下降8%
选择石英晶振时必须要考虑的四个问题
智能水表加快普及,用差异化服务吃下800亿元替换空间?
接触电阻怎么测_接触电阻影响因素
是真是假?将iOS10.2装进小米手机,结果让我恍然大悟
ups不间断电源品牌排行
生活中常见的人工智能应用
喜讯 | 西井科技荣获“国家知识产权优势企业”称号