Python2.7 获取指定进程PID、CPU、内存、主机名、IP地址、文件修改时间
获取PID、CPU、内存使用率使用了psutil库,Git地址:https://github.com/giampaolo/psutil
直接上代码
主体代码
#-*- encoding:UTF-8 -*-
import json
import os
import time
import socket
import psutil
import config
import threading
class Statues():
def __init__(self):
self.dir_name = config.folder_name
def get_pid(self, name):
"""
获取指定进程的PID、内存、CPU、子进程PID、内存、CPU信息
:param name: 进程名
:return:
"""
pids = psutil.pids()
result_dict = dict()
for pid in pids:
try:
p = psutil.Process(pid)
except Exception:
continue
if p.name() == name:
try:
cpu = psutil.Process(p.pid)
except Exception:
continue
cpu = cpu.cpu_percent(interval=1)
childrens = psutil.Process(p.pid).children()
# 获取占用内存百分比
mem = psutil.Process(p.pid).memory_percent(memtype="rss")
mem = round(mem, 2)
# 获取总内存
total_mem = psutil.virtual_memory().total
total_mem = total_mem / 1024 / 1024
memory = total_mem * mem / 100
ch_list = list()
for ch in childrens:
# print ch
ch_dict = dict()
ch_mem = psutil.Process(ch.pid).memory_percent(memtype="rss")
ch_mem = round(ch_mem, 2)
ch_memory = total_mem * ch_mem / 100
# 一个主进程会存在对个子进程,将这些子进程放进列表中
ch_dict["children_name"] = ch.name()
ch_dict["children_pid"] = ch.pid
ch_dict["ch_memory"] = round(ch_memory, 2)
ch_list.append(ch_dict)
# 如果一个主进程没有子进程,那么子进程列表为空
result_dict[name + "_" + str(p.pid)] = {
"ProcessName": p.name(),
"PID": p.pid,
"CPU": cpu,
"memory": round(memory, 2),
"ch_list": ch_list,
}
return result_dict
def get_local_name_IP(self):
"""
获取本地名, 获取本地IP地址
:return:
"""
# 获取本机电脑名
myname = socket.gethostname()
# 获取本机ip
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
myaddr = s.getsockname()[0]
return myname, myaddr
def get_edit_time(self, files):
"""
获取文件修改时间
:param files: 文件列表
:return:
"""
file_dir = self.get_dirpath(self.dir_name)
file_edit_time = dict()
for file in files:
full_path = os.path.join(file_dir, file)
mtime = os.stat(full_path).st_mtime
file_modify_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime))
file_edit_time[file] = file_modify_time
return file_edit_time
def get_dirpath(self, folder_name):
"""
获取文件夹路径
:param folder_name: 文件夹名称
:return: 文件夹路径
"""
cur_path = os.path.dirname(os.path.realpath(folder_name))
dir_path = os.path.join(cur_path, folder_name)
return dir_path
def get_file_list(self):
"""
获取文件列表
:return:
"""
file_dir = self.get_dirpath(self.dir_name)
# 获取指定目录下的所有子目录和文件名列表
dir_tupple = os.walk(file_dir)
files_list = list()
for path, dirs, files in dir_tupple:
files_list = files
return files_list
def conn_redis(self):
import redis
redis_host = config.redis_host
redis_port = config.redis_port
conn = redis.Redis(redis_host, redis_port, decode_responses=True)
if conn:
return conn
def return_data(self):
# status = Statues()
file_list = self.get_file_list() # 获取文件列表
edit_time = self.get_edit_time(file_list) # 获取最后编辑时间
name, IP = self.get_local_name_IP() # 获取计算机名和IP地址(元组)
process_name_list = config.process_name_list
process_info_dict = dict()
for process_name in process_name_list:
result_dict = self.get_pid(process_name)
dict_items = result_dict.items()
for key, values in dict_items:
process_info_dict[key] = values
# 暂时移除日志文件最后一次修改时间的处理
# process_info_dict["log_edit_time"] = edit_time
process_info_dict = json.dumps(process_info_dict)
filed = name + "_" + IP
con_redis = self.conn_redis()
redis_key = config.redis_key
con_redis.hset(redis_key, filed, process_info_dict)
runing_time = config.runing_time
timer = threading.Timer(runing_time, self.return_data)
timer.start()
if __name__ == '__main__':
status = Statues()
# 第一次运行
timer = threading.Timer(1, status.return_data)
timer.start()
代码中使用了线程的定时执行的方法,将采集到的数据转成json后通过hash的方式存入Redis内
config.py
#-*- encoding:UTF-8 -*-
# 文件夹名称
folder_name = "Test"
# redis配置
redis_host = "192.168.*.*"
redis_port = 6379
# 需要监控的进程列表
process_name_list = [
# "Postman.exe",
# "python.exe",
"QQBrowser.exe",
# "WeChat.exe"
]
# 定时启动时间
runing_time = 60
# redis的key
redis_key = "*****"