0
点赞
收藏
分享

微信扫一扫

py脚本:获取进程信息

这里以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)


举报

相关推荐

0 条评论