# 这里以mysqld进程为例子
# pip install psutil
import psutil
import time
import re, sys

# x:进程name y:非进程name
# 由于这里监控的是mysqld,如果不加限制的话会先识别mysqld_safe,所以要加上mysql_safe的判别 
def processinfo(x, y):
    p_list = psutil.process_iter()
    tlp = 0
    try:
        for process in p_list:
            aa = str(process)
            f_x = re.compile(x, re.I)
            f_y = re.compile(y, re.I)
            if f_x.search(aa) and f_y.search(aa) == None:
                tlp = int(aa.split('pid=')[1].split(',')[0]) 
                # 检索pid列表并获取传入值的pid
                return tlp
    except (psutil.NoSuchProcess):
            print('Ransomware process is caught, but the process does '
                  'not exist (PID: %d)' % aa.pid)

# tlp:进程pid
# 打印出time、pid、name、%mem、%cpu
def getinfo(tlp):
    p = psutil.Process(tlp)
    try:
        pid = p.pid
        name = p.name()
        Memory = p.memory_percent(memtype="rss")
        localtime = time.strftime('%H:%M:%S', time.localtime(time.time()))
        # 取进程pid 进程名 进程内存
    except IOError as e:
        print(e)
    else:
        # return pid, name, Memory, time
        print("Time:%s" % (localtime), "PID:%s" % (pid), "Name:%s" % (name),"Memory=%.3f%%" % (Memory))


if __name__ == "__main__":
    while 0 < 1:
        s = processinfo('mysqld','mysqld_safe')
        getinfo(s)
        time.sleep(5)

# 打印结果
# [root@VM-90-225-centos /home/hanhan/NewProject/test]# python test_demo.py 
# Time:17:06:17 PID:2705 Name:mysqld Memory=30.605%
# Time:17:06:22 PID:2705 Name:mysqld Memory=30.605%
# Time:17:06:27 PID:2705 Name:mysqld Memory=30.605%


# 完整脚本如下
# pip install psutil
import psutil
import time
import re, os
import logging


MEM_MAX = 70
sleep_time = 60 * 5
# # x:进程name y:非进程name
# # 由于这里监控的是mysqld,如果不加限制的话会先识别mysqld_safe,所以要加上mysql_safe的判别 
# def processinfo(x, y):
#     p_list = psutil.process_iter()
#     tlp = 0
#     try:
#         for process in p_list:
#             aa = str(process)
#             f_x = re.compile(x, re.I)
#             f_y = re.compile(y, re.I)
#             if f_x.search(aa) and f_y.search(aa) == None:
#                 tlp = int(aa.split('pid=')[1].split(',')[0]) 
#                 # 检索pid列表并获取传入值的pid
#                 return tlp
#         # 没有找到该进程,返回None
#         return None
#     except (psutil.NoSuchProcess):
#             logging.critical('Ransomware process is caught, but the process does '
#                   'not exist (PID: %d)' % aa.pid)

# tlp:进程pid
# 打印出time、pid、name、%mem、%cpu
def getinfo(tlp):
    p = psutil.Process(tlp)
    try:
        pid = p.pid
        name = p.name()
        Memory = p.memory_percent(memtype="rss")
        localtime = time.strftime('%H:%M:%S', time.localtime(time.time()))
        # 取进程pid 进程名 进程内存
    except IOError as e:
        logging.critical(e)
    else:
        # return pid, name, Memory, time
        msg = "Time:" + str(localtime) + " PID:" + str(pid) + " Name:" + str(name) + " Memory=" + str(Memory)
        logging.info(msg)
    return  Memory

def load_mysql():
    os.system("/etc/init.d/mysqld start")
    logging.critical("load_mysql")
    time.sleep(60)

def reload_mysql():
    os.system("/etc/init.d/mysqld restart")
    logging.critical("reload_mysql")
    time.sleep(60)

def stop_my_project():
    os.system("sh stop.sh")
    time.sleep(60)
    logging.critical("stop_my_project")

def start_my_project():
    os.system("sh start.sh")
    time.sleep(5)
    logging.critical("start_my_project")


# 初始化日志记录文件
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"
logging.basicConfig(filename = '/var/www/html/NewTest/watchdog_log/mysql_watch_dog.log', level = logging.WARNING, format = LOG_FORMAT, datefmt = DATE_FORMAT)

# 每1min执行一次探测
if __name__ == "__main__":
    while 0 < 1:
        s = processinfo('mysqld','mysqld_safe')
        if s != None:
            mem_percent = getinfo(s)
            # 如果mysql占用的内存过多,重启服务
            if mem_percent >= MEM_MAX:
                logging.critical("需要重启mysql以及重启我们的project服务")
                stop_my_project()
                reload_mysql()
                start_my_project()
            # else:
            #     logging.critical("mysql仍然在正常运行,什么都不需要做")
        else:
            logging.critical("需要启动mysql以及重启我们的project服务")
            stop_my_project()
            load_mysql()
            start_my_project()
        time.sleep(sleep_time)