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'))
删除文件
原文地址:https://www.cnblogs.com/sunjinchao/p/12703045.html