这里以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 = 0try: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列表并获取传入值的pidreturn tlpexcept (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.pidname = 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, timeprint("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 loggingMEM_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 = 0try: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列表并获取传入值的pidreturn tlp# 没有找到该进程,返回Nonereturn Noneexcept (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.pidname = 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, timemsg = "Time:" + str(localtime) + " PID:" + str(pid) + " Name:" + str(name) + " Memory=" + str(Memory)logging.info(msg)return Memorydef 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)