当前位置 博文首页 > python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件

    python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件

    作者:小胡要加油 时间:2021-02-01 18:05

        使用Windows的wmic命令,获取可执行文件的运行状况、文件路径、PID,如果可执行文件挂掉,就重启并邮件告警。

          因为监控的可执行文件的文件名一样,不好区分,所以我使用文件的绝对路径为标准来判断是否正常运行,代码及详细解释如下:

    # -*- coding: utf-8 -*- 
    import os
    import win32api
    import smtplib
    from email.mime.text import MIMEText
    
    
    def get_pidWay(file_name):
      ept_list = []
      temp_list = []
      pid_way = os.popen("wmic process where name='" + file_name + "' get processid,executablepath,name").readlines()
      for j in pid_way:
        temp_list.append(j.split())
      while ept_list in temp_list:
        temp_list.remove(ept_list)
      return(temp_list)
     
    def open_file(filePath):
      win32api.ShellExecute(0, 'open', filePath, '','',1)
    
    def mailsend (mailtext,mailsubject):
      mailserver = "smtp.qq.com"
      username_send = '发送的邮箱地址'
      password = '密码'
      username_recv = '接收的邮箱地址'
      mail = MIMEText(mailtext)
      mail['Subject'] = mailsubject
      mail['From'] = username_send
      mail['To'] = username_recv
      smtp = smtplib.SMTP_SSL(mailserver)
      smtp.login(username_send,password)
      smtp.sendmail(username_send,username_recv,mail.as_string())
      smtp.quit()
      print ('success')
      
    
    
    file_path = "可执行文件的绝对路径"
    fileName = '可执行文件名'
    mailtext = '报警邮件内容'
    mailsubject = '报警邮件标题'
    exe_info = get_pidWay(fileName)
    pos = 0
    for i in range(len(exe_info)):
      if file_path in exe_info[i][0]:
        pos = 1
      else:
        pass
    
    if pos == 1:
      pass
    else:
      open_file(r"可执行文件名")
      mailsend(mailtext,mailsubject)

    1.get_pidWay函数:

      输入file_name,返回文件路径、文件名、文件Pid的列表,用split函数和ept_list字符串使返回的列表变成[[文件路径,文件名,Pid],[文件路径,文件名,Pid]]这样的二维数组;

    2.open_file函数:

      使用win32api模块,类似在cmd中执行程序,打开指定的可执行文件;

    3.mailsend函数:

      发送邮件,我用的qq的smtp模块,在qq邮箱的设置里可以开启smtp端口;

      username_send发送邮件的邮箱地址,password是开启smtp端口时弹出的字符串;

      username_recv收邮件的邮箱地址;

      在内网要采用smtplib.SMTP_SSL(mailserver)连接(其中mailserver= ‘smtp.qq.com'),使用smtp = smtplib.SMTP(mailserver,port=465)方式会报错:smtplib.SMTPServerDisconnected: Connection unexpectedly closed

    4.主函数:

      file_path :放置可执行文件的目录;

      fileName:可执行文件的文件名;

      for循环来判断file_path是否在我们 get_pidWay函数返回的列表中,从而知道可执行文件是否正常运行;

      如果没有运行,pos = 0,则运行文件、发送邮件。

    js
    下一篇:没有了