广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3 实现简易ping监控并发
  • 321
分享到

Python3 实现简易ping监控并发

简易ping 2023-01-31 08:01:21 321人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

python3 实现简易ping监控并发动报警邮件1、实现原理通过ping命令结果获取丢包率和延时情况,当丢包率和延时达到预设值时,将结果作为邮件内容,并发送邮件2、邮件是用smtplib和email实现发送的3、目前脚本有个小问题就是:我

python3 实现简易ping监控并发动报警邮件

1、实现原理通过ping命令结果获取丢包率和延时情况,当丢包率和延时达到预设值时,将结果作为邮件内容,并发送邮件

2、邮件是用smtplib和email实现发送的

3、目前脚本有个小问题就是:我打开文件,循环读,当读第一行时,我执行ping,获取结果,把结果写到一个文件里,同时判断是否达到预设值,如果达到,就把结果加到邮件内容,就这样一直循环,当把文件读完,然后关闭这两个文件,再发送邮件。总觉得有点问题,应该将结果存到一个列表,一次性写入。算了就先这样玩吧。


代码如下:

# -*- coding:utf-8 -*-

__author__   = 'babyshen'
__version__  = '0.0.3'
__datetime__ = '2016-12-30 03:30:00'

import os
import subprocess
import smtplib
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE,fORMatdate
from email import encoders

# server['name'], server['user'], server['passwd']
def send_mail(server, fro, to, subject="", text="", files=[]):
    assert type(server) == dict
    assert type(to) == list
    assert type(files) == list

    msg = MIMEMultipart()
    msg['From'] = fro                # 邮件的发件人
    msg['Subject'] = subject         # 邮件的主题
    msg['To'] = COMMASPACE.join(to)  # COMMASPACE==', ' 收件人可以是多个,to是一个列表
    msg['Date'] = formatdate(localtime=True) # 发送时间
    msg.attach(MIMEText(text,'plain','utf-8'))

    for file in files:          # 添加附件可以是多个,files是一个列表,可以为空
        part = MIMEBase('application', 'octet-stream') #'octet-stream': binary data
        with open(file,'rb') as f:
            part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'p_w_upload; filename="%s"' % os.path.basename(file))
        msg.attach(part)

    smtp = smtplib.SMTP()
    smtp.connect(server['name']) # connect有两个参数,第一个为邮件服务器,第二个为端口,默认是25
    smtp.login(server['user'], server['passwd']) # 用户名,密码
    smtp.sendmail(fro, to, msg.as_string()) # 发件人,收件人,发送信息
    smtp.close()  # 关闭连接

def ping_test(src,dest):
    ping = subprocess.Popen('/bin/ping -i 0.2 -c 4 -q -I ' + src + ' ' + dest,
                            shell=True,
                            stderr=subprocess.PIPE,
                            stdout=subprocess.PIPE) # 执行命令
    res,err = ping.communicate()
    if err: sys.exit(err.decode().strip('\n'))
    pres = list(res.decode().split('\n'))
    loss = pres[3].split()[5]  # 获取丢包率
    try:
        rtt = pres[4].split('/')[4] # 获取rtt avg值
    except IndexError:
        rtt = ""
    return loss,rtt

def ping_res(file,revfile):
    with open(file, 'r', encoding='utf-8') as f:
        with open(revfile, 'w', encoding='utf-8') as f1:
            textmail = text = '%-15s %-15s %-15s %-5s %-5s \n' % ('host','src','dest','loss','rtt')
            f1.write(text)
            for line in f:
                host = line.split()[0]
                src = line.split()[1]
                dest = line.split()[2]
                threshold = line.split()[3] if len(line.split()) == 4 else 100
                loss, rtt = ping_test(src, dest)
                text = '%-15s %-15s %-15s %-5s %-5s \n' % (host, src, dest, loss, rtt)
                f1.write(text)
                # 判断丢包率和延时是不是达到预设值
                if float(loss.strip('%')) > 10 or float(rtt) > float(threshold):
                    textmail += text
    return textmail

if __name__ == '__main__':
    try:
        file = '/root/ping_test/ping_test.cfg' # 配置文件,格式(空格隔开):主机名,源地址,目标地址,延时阀值(默认是100)
        revfile = '/root/ping_test/ping_test.rev' # 结果文件
        textmail = ping_res(file,revfile) # 邮件内容
        # print(textmail)
        server = {'name':'mail.baidu.com',
                  'user':'xxxx',
                  'passwd':xxoo''}
        fro = 'xxxxx'
        to = ['ooooo']
        subject = 'ping_test'
        if len(textmail.split('\n')) == 2 : sys.exit() # 当只有一行时退出程序不发送邮件
        send_mail(server,fro,to,subject,textmail)
    except smtplib.SMTPAuthenticationError:
        sys.exit("Mail Authentication Failed")
    except KeyboardInterrupt:
        sys.exit(249)
    except Exception as e:
        sys.exit(e)

GitHub地址:https://github.com/babyshen/python/blob/master/monitor.py

升级版本已实现命令行参数和守护进程模式

github地址:Https://github.com/babyshen/Python/blob/master/monitor_2.py

--结束END--

本文标题: Python3 实现简易ping监控并发

本文链接: https://www.lsjlt.com/news/192474.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python3 实现简易ping监控并发
    Python3 实现简易ping监控并发动报警邮件1、实现原理通过ping命令结果获取丢包率和延时情况,当丢包率和延时达到预设值时,将结果作为邮件内容,并发送邮件2、邮件是用smtplib和email实现发送的3、目前脚本有个小问题就是:我...
    99+
    2023-01-31
    简易 ping
  • node中如何使用Nest.js实现简易版请求监控
    本篇内容介绍了“node中如何使用Nest.js实现简易版请求监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2022-10-19
  • Python实现监控屏幕界面内容变化并发送通知
    目录需求实现原理代码接收通知需求 有时候需要实时监控屏幕上的信息是否发生变化,例如监控某个公众号是否发送了推送,可能是你重要的一个信息来源渠道,你希望第一时间留意到,抢热点等~那么可...
    99+
    2023-05-17
    Python实现实时监控屏幕 Python监控屏幕 Python监控
  • Python怎么实现监控屏幕界面内容变化并发送通知
    需求有时候需要实时监控屏幕上的信息是否发生变化,例如监控某个公众号是否发送了推送,可能是你重要的一个信息来源渠道,你希望第一时间留意到,抢热点等~那么可以使用Python编写这么一个脚本进行监控屏幕像素变化,只要像素发生变化,基本就是内容发...
    99+
    2023-05-14
    Python
  • Python如何实现监控屏幕界面内容变化并发送通知
    这篇文章主要介绍了Python如何实现监控屏幕界面内容变化并发送通知的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现监控屏幕界面内容变化并发送通知文章都会有所收获,下面我们一起来看看吧。需求有...
    99+
    2023-07-06
  • Java并发编程和Linux日志记录:如何实现高效的系统监控?
    随着信息技术的发展,系统监控越来越成为了一个必不可少的部分。对于企业或个人用户来说,保证系统的稳定性和安全性是至关重要的。因此,本文将介绍如何利用Java并发编程和Linux日志记录实现高效的系统监控。 一、Java并发编程 Java是一...
    99+
    2023-10-28
    并发 linux 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作