zoukankan      html  css  js  c++  java
  • Centos 7: Python3运维脚本(查看服务器信息并发送邮件)

    1、查看内存占比

    #!utf-8
    import os
    lis = []
    sram = 0
    str1 = os.popen('ps aux','r').readlines()
    #os.popen,管道输出 strsum
    = os.popen('grep MemTotal /proc/meminfo','r').readlines() for i in strsum: sumram = i.split() print('总内存:%s'%sumram[1],'kb') for i in str1: str2 = i.split() new_rss = str2[5] lis.append(new_rss) for i in lis[1:-1]: num = int(i) sram = sram + num print('已使用内存:%s' %sram,'kb')

    2、系统信息python脚本

    import psutil
    import datetime
    import time
    
    # 当前时间
    now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
    print(now_time)
    
    # 查看cpu物理个数的信息
    print(u"物理CPU个数: %s" % psutil.cpu_count(logical=False))
    
    #CPU的使用率
    cpu = (str(psutil.cpu_percent(1))) + '%'
    print(u"cup使用率: %s" % cpu)
    
    #查看内存信息,剩余内存.free  总共.total
    #round()函数方法为返回浮点数x的四舍五入值。
    
    free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
    total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
    memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
    print(u"物理内存: %s G" % total)
    print(u"剩余物理内存: %s G" % free)
    print(u"物理内存使用率: %s %%" % int(memory * 100))
    # 系统启动时间
    print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))
    
    # 系统用户
    users_count = len(psutil.users())
    users_list = ",".join([u.name for u in psutil.users()])
    print(u"当前有%s个用户,分别是 %s" % (users_count, users_list))
    
    #网卡,可以得到网卡属性,连接数,当前流量等信息
    net = psutil.net_io_counters()
    bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
    bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
    print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))
    
    io = psutil.disk_partitions()
    # print(io)
    # print("io[-1]为",io[-1])
    #del io[-1]
    
    print('-----------------------------磁盘信息---------------------------------------')
    
    print("系统磁盘信息:" + str(io))
    
    for i in io:
        o = psutil.disk_usage(i.device)
        print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
        print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
        print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")
    
    print('-----------------------------进程信息-------------------------------------')
    # 查看系统全部进程
    for pnum in psutil.pids():
        p = psutil.Process(pnum)
        print(u"进程名 %-20s  内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " 
        % (p.name(), p.memory_percent(), p.status(),time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(p.create_time()))))
    
    #后面是时间格式化
    View Code

     3、如果服务器内存或者cpu使用率超过多少,值后就发送邮件

    import psutil
    def send_email(message):
        # smtplib 用于邮件的发信动作
        import smtplib
        from email.mime.text import MIMEText
        # email 用于构建邮件内容
        from email.header import Header
    
        # 用于构建邮件头
    
        # 发信方的信息:发信邮箱,QQ 邮箱授权码
        from_addr = '402290116@qq.com'
        password = 'kdnofixadmtrbiaf'
        # 邮箱的授权码在qq邮箱里打开
    
        # 收信方邮箱
        to_addr = 'system_temp@163.com'
    
        # 发信服务器
        smtp_server = 'smtp.qq.com'
    
        # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
        msg = MIMEText(message, 'plain', 'utf-8')
    
        # 邮件头信息
        msg['From'] = Header(from_addr)
        msg['To'] = Header(to_addr)
        msg['Subject'] = Header('Warning, the server has an exception')
    
        # 开启发信服务,这里使用的是加密传输
        server = smtplib.SMTP_SSL(smtp_server)
        server.connect(smtp_server, 465)
        # 登录发信邮箱
        server.login(from_addr, password)
        # 发送邮件
        server.sendmail(from_addr, to_addr, msg.as_string())
        # 关闭服务器
        server.quit()
        return '发送成功'
    #磁盘信息
    diskinfo = psutil.disk_usage('/')
    #内存信息
    meminfo = psutil.virtual_memory()
    free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
    total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
    memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
    # print(u"物理内存: %s G" % total)
    # print(u"剩余物理内存: %s G" % free)
    # print(u"物理内存使用率: %s %%" % int(memory * 100))
    
    cpu = (float(psutil.cpu_percent(1)))
    print(u"cup使用率: %s" % cpu+ '%')
    used_memory = int(memory*100)
    if used_memory > 70 or cpu > 30:
        send_email('服务器内存使用率超过70%,请及时处理')

     4、通过文件名,和时间来删除SQL的日志

    #! /usr/bin/local/python3
    # -*- coding: utf-8 -*-
    import os,time,shutil
    
    #shutil模块作用
    # 1、快速的文件复制
    # 2、快速的文件压缩
    # 3、快速的文件目录递归复制
    path = os.getcwd() #用于返回当前工作目录
    target_dir = []  #目标目录
    cal = [] #文件名
    target_dir.append('/var/log/')
    target_dir.append('/newlogs/')
    target_dir.append('/oldlogs/')
    #初始化删除文件名
    del_ext = ['frm','MYD','MYI']  #扩展名
    #你要保留几天
    days_before = 90
    #初始化删除日期
    for x in range(days_before+1,days_before+30):
        cal.append(time.strftime('%Y_%m_%d',time.localtime(time.time() - x*24*3600)))
        #time.strftim :接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。[time.strftime(format[, t])]
        #time.localtime:作用是格式化时间戳
        #time.time:当前时间戳
    #初始化删除文件名,使用笛卡尔积!
    fl = map('.'.join, [[x,y] for x in cal for y in del_ext])#
    #通过map函数, 组成文件名
    #f1=map('.'.join,[[2, 'frm'], [2, 'MYD'], [2, 'MYI'], [3, 'frm'], [3, 'MYD'], [3, 'MYI']])
    
    
    '''
    map :map() 会根据提供的函数对指定序列做映射
    例子
    def square(x) :            # 计算平方数
         return x ** 2
    
    map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
    结果:[1, 4, 9, 16, 25]
    '''
    
    #——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
    #以日期命名的文件夹
    cal = []
    for x in range(days_before+1,days_before+30):
        cal.append(time.strftime('%Y-%m-%d',time.localtime(time.time() - x*24*3600)))
    fl += cal
    #获取文件扩展名
    def get_ext(filename):
        return filename.split('.')[-1]
    
    
    
    for dirs in target_dir:
        #files = [i for i in box_list if(get_ext(i) in del_ext)]  #按扩展名筛选文件
        #修改当前工作目录
        i = 0
        print('opening -> ' + dirs)
        #判断文件夹存在
        if os.path.exists(dirs):  #如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。
            #切换目录
            os.chdir(dirs)#os.chdir() 方法用于改变当前工作目录到指定的路径。
            for files in fl:
                #判断文件夹或文件
                if(os.path.isfile(str(files))):  #os.path.isfile判断路径是否为文件
                    i += 1
                    try:
                        os.remove(files) #os.remove() 方法用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。
                        print(files + '  deleted')
                    except:
                        print('error occurs while deleting file')
                elif(os.path.isdir(str(files))): #os.path.isdir()用于判断对象是否为一个目录
                    i += 1
                    try:
                    #shutil.rmtree删除非空文件夹
                        shutil.rmtree(files) #shutil.rmtree() 表示递归删除文件夹下的所有子文件夹和子文件
                        print(files + '  deleted')
                    except:
                        print('error occurs while deleting file')
        else:
            print('Error on opening ' + dirs)
        if i:
            print(str(i) + ' files deleted')
        else:
            print('nothing to remove')
        print('leaving -> ' + dirs)
    
    #修改后 ,我未测试。
    摘录网上的,删除SQL的日志文件

    5、通过日志的最后访问时间,删除3个月以上的日志文件

    import os, datetime,time
    
    delday = 90 * 24 *3600
    base_dir = '/data/webdata/log'
    list = os.listdir(base_dir)
    #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
    filelist = []
    for i in range(0, len(list)): #len(list)有多少个文件或文件夹
        path = os.path.join(base_dir, list[i])  #目录和名字相拼接
        if os.path.isfile(path):  #判断是否为文件,如果是文件则加入空列表
            filelist.append(list[i])
    '''
    os.path.isdir()和os.path.isfile()需要传入的参数是绝对路径,但是os.listdir()返回的只是一个某个路径下的文件和列表的名称.**
    
    常见错误:直接使用os.listdir()的返回值当做os.path.isdir()和os.path.isfile()的入参
    
    正确用法:需要先使用python路径拼接os.path.join()函数,将os.listdir()返回的名称拼接成文件或目录的绝对路径
    再传入os.path.isdir()和os.path.isfile()
    
    
    '''
    for i in range(0, len(filelist)):
        path = os.path.join(base_dir, filelist[i])
        if os.path.isdir(path): #判断是否为文件
            continue
        #方法1
        timestamp = os.path.getmtime(path) #返回最近文件修改时间
       # 方法2 :os.stat :用于在给定的路径上执行一个系统 stat 的调用。
        #st_atime: 上次访问的时间。
        #st_mtime: 最后一次修改的时间。
        ts1 = os.stat(path).st_mtime
        #
        current_time = time.time()  #当前时间
        print(type(current_time))
        time_difference=current_time - timestamp
        if time_difference > delday :
            os.remove(path)
            print(path,'已删除')
        # date = datetime.datetime.fromtimestamp(timestamp)
        # print(list[i], ' 最近修改时间是: ', date.strftime('%Y-%m-%d %H:%M:%S'))
    删除文件
  • 相关阅读:
    服务端实现url网页截屏、HTML保存为高质量PDF[puppeteer]
    网页保存为图片[rasterizeHTML]
    SortedList<T,K>,SortedDictionary<T,K>,Dictionay<T,K>用法区别
    svn实现类似git stash及git stash pop的功能
    MSBuild报错及找不到AxImp.exe或LC.exe问题
    记一个ios下text-overflow: ellipsis 与 text-align: justify 冲突的问题
    Chrome devtools inspect后打开空白解决办法
    Oracle长时间使用导致连接变慢且频繁报无法找到监听程序的错误
    vscode+vue不得不用的插件和不得不添加的配置
    初识vscode+vue
  • 原文地址:https://www.cnblogs.com/sunjinchao/p/12703045.html
Copyright © 2011-2022 走看看