【操作系统】Python3 监控服务器的CPU、硬盘、内存和各个端口的开启情况

34 篇文章 2 订阅
28 篇文章 0 订阅

1、简介

由于项目的需要,需要做一个简单监控服务器的CPU利用率、CPU负载、硬盘使用率、内存利用率和服务器的各个端口的开启情况的程序,并把结果通知到监控平台,如果出现异常,监控平台打电话或者发短信通知给具体的运维人员。博主写了负责监控的代码,供大家学习参考哈~

2、效果

2.1、Linux效果

在这里插入图片描述

2.2、Windows效果

在这里插入图片描述

3、核心源码

3.1、核心程序

# 获取端口信息
	@classmethod
	def get_ports(cls, port):
		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		result = sock.connect_ex(('127.0.0.1',int(port)))
		if result != 0:
			send_data = cls.g_web_ip+"服务器的"+port+'端口挂了,快去修复哈'
			cls.send_msg(send_data)
		else:
			print("端口:"+port+"正常")

	# CPU利用率
	@classmethod
	def get_cpu_used(cls):
		if (sysstr == "Linux"):
			f = os.popen("top -bi -n 1| awk '{print $4}'").read().split('\n')[2]
			float_cpu_used = float(f)
			float_g_cpu_used = float(cls.g_cpu_used.split("%")[0])
			print("CPU利用率:",f,"%")
			if float(float_cpu_used) > float(float_g_cpu_used):
				cls.send_msg(cls.g_web_ip+"服务器的CPU利用率超过"+cls.g_cpu_used+"了,快去看看咋回事!")
		else:
			print(sysstr + " CPU Adoption rate Cannot read.")
		printL()

	# CPU平均负载
	@classmethod
	def aver_load(cls):
		if (sysstr == "Linux"):
			f = os.popen("uptime | sed 's/,//g' | awk '{print $8,$9,$10}'")
			str_aver_load = f.read().strip().split(":")[1].strip()
			print("CPU平均负载:",str_aver_load)
			if float(str_aver_load) > float(cls.g_aver_load):
				cls.send_msg(cls.g_web_ip+"服务器的CPU平均负载超过"+cls.g_aver_load+"了,快去看看咋回事!")
		else:
			print(sysstr + " CPU Load average Cannot read.")
		printL()

	#获取硬盘使用率
	@classmethod
	def get_disk_used(cls):
		if (sysstr == "Linux"):
			disk_val = os.popen("df -h | head -2 | tail -1 |awk '{print $5}'").read().strip()
			int_disk_val = int(disk_val.split("%")[0])
			int_g_disk_val = int(cls.g_disk_used.split("%")[0])
			print("硬盘使用率:",disk_val)
			if int_disk_val > int_g_disk_val:
				cls.send_msg(cls.g_web_ip+"服务器的硬盘使用率超过"+cls.g_disk_used+"了,快去看看咋回事!")
		else:
			print(sysstr + " hard disk Cannot read.")
		printL()

	# 获取内存使用率
	@classmethod
	def get_mem_used(cls):
		if (sysstr == "Linux"):
			f = os.popen("free -m |grep Mem |awk '{print $3/$2}'")
			str_men = f.read().strip()
			print("内存使用率:",str_men)
			if float(str_men) > float(cls.g_mem_used):
				cls.send_msg(cls.g_web_ip+"服务器的内存使用率超过"+cls.g_mem_used+"了,快去看看咋回事!")
		else:
			print(sysstr + " RAM Cannot read.")
		printL()

	#调用报警函数
	@classmethod
	def send_msg(cls, content):
		cls.send_http(content)

	# 调用http接口
	@classmethod
	def send_http(cls,content):
		printL()
		print("send_http:",type(content),content)
		url_total = cls.g_php_url + "?msg=" + content
		print("url_total:",url_total)
		rp = requests.get(url_total)
		print("rp:",rp.text)
		printL()

	# 发微信预警消息
	@classmethod
	def send_wx_alarm(cls,content):
		post_url = cls.g_wx_url
		for id in cls.g_wx_id:
			try:
				post_data = '{"operSys":"MCS","content":"服务器监控告警:%s\n%s","phones":"%s"}'%(cls.g_web_ip, content, id)
				print(post_data)
				# data = urllib.parse.urlencode(post_data)
				# data = data.encode('utf-8')

				req = requests.get(url=post_url,data=post_data)
				print("send_wx_alarm req:",req,type(req))
				result = json.loads(req.text())
				print(result)
			except Exception as e:
				print("send_wx_alarm:",e)

	# 发邮件预警消息
	@classmethod
	def send_email_alarm(cls,content):
		post_url = cls.g_email_url
		for id in cls.g_email_id:
			try:
				post_data = '{"subject":"%s服务器监控告警","email":"%s","bccEmail":"","operSys":"LOG","content":"%s"}'%(cls.g_web_ip, id, content)
				print(post_data)
				# data = urllib.parse.urlencode(post_data)
				# data = data.encode('utf-8')

				req = requests.get(url=post_url,data=post_data)
				print("send_email_alarm req:",req,type(req))
				# req.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
				result = json.loads(req.text())
				print(result)
			except Exception as e:
				print("send_email_alarm:",e)

3.2、配置文件

# 本机IP地址(这里之所以不自动获取是因为有些机器只有内网)
web_ip=***

# 检测的端口
monitor_ports=3306, 8088, 6004 ,6379

# CPU利用率
cpu_used=100%

# CPU平均负载
aver_load=1

# 内存使用率
mem_used=0.8

# 磁盘使用率
disk_used=80%

# 通知地址
php_url=http://***:**/TaskMonitor/action

# 微信地址
wecaht_url=http://***:**/wechat/sendWeChat

# 微信ID
wecaht_id=123456,13123

# email地址
email_url=http://***:**/email/sendEmail

# 邮件邮箱
email_id=test@mucfc.com,11223344@qq.com

3.3、ReadMe

# 1、Python语言的应用 之 Demo_Monitor_Python
简单监控的CPU利用率、CPU平均负载、硬盘使用率、内存使用率 和 各个端口的开启状况
适用系统:Linux (注意:不适合Windows)

# 2、更新信息
开发者:沙振宇(沙师弟专栏) 
创建时间:2019-7-9
最后一次更新时间:2019-12-12
CSDN博客地址:https://shazhenyu.blog.csdn.net/article/details/98615482

# 3、使用前准备
python版本要求:python3.0 以上
安装 python 的 psutil 包 和 requests 包
pip install psutil
pip install requests

# 4、启动方式
nohup python3 monitor.py > monitor.log 2>&1 &
注:需要定期清理 monitor.log 文件

# 5、运行效果
![image](https://github.com/ShaShiDiZhuanLan/Demo_Monitor_Python/blob/master/%E7%9B%91%E6%8E%A7.png)

4、本项目Github源码分享

https://github.com/ShaShiDiZhuanLan/Demo_Monitor_Python

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用Python的PySNMP库来通过SNMP方式获取远程服务器CPU内存硬盘使用率。以下是一个简单的示例脚本: ```python from pysnmp.hlapi import * # SNMP团体字符串 community_string = 'public' # 远程服务器IP地址 ip_address = '192.168.1.1' # SNMP端口号,默认为161 snmp_port = 161 # CPU利用率OID cpu_oid = '1.3.6.1.4.1.2021.11.9.0' # 内存使用率OID memory_oid = '1.3.6.1.4.1.2021.4.6.0' # 磁盘使用率OID disk_oid = '1.3.6.1.4.1.2021.9.1.9.1' # 使用SNMP获取指定OID的值 def get_snmp_value(oid): error_indication, error_status, error_index, var_binds = next( getCmd(SnmpEngine(), CommunityData(community_string), UdpTransportTarget((ip_address, snmp_port)), ContextData(), ObjectType(ObjectIdentity(oid))) ) if error_indication: print(f"SNMP错误:{error_indication}") return None if error_status: print(f"SNMP错误:{error_status.prettyPrint()}") return None for var_bind in var_binds: return var_bind[-1] # 获取CPU利用率 cpu_usage = get_snmp_value(cpu_oid) print(f"CPU利用率:{cpu_usage}%") # 获取内存使用率 memory_usage = get_snmp_value(memory_oid) print(f"内存使用率:{memory_usage}%") # 获取磁盘使用率 disk_usage = get_snmp_value(disk_oid) print(f"磁盘使用率:{disk_usage}%") ``` 请确保你已经安装了PySNMP库,可以使用以下命令进行安装: ```shell pip install pysnmp ``` 在脚本中,你需要指定远程服务器的IP地址、SNMP团体字符串、SNMP端口号以及要获取的OID。然后,使用`get_snmp_value`函数获取相应的OID的值,并打印出来。 注意:这只是一个简单的示例,实际的SNMP OID可能因设备而异。你可以使用SNMP浏览器来查找你所需的OID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值