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())))) #后面是时间格式化
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) #修改后 ,我未测试。
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'))
人生苦短,我用Python