Python 可以通过 psutil 模块监控进程状态,记录进程号和重启时间。
安装 psutil 模块
psutil 模块可以通过 pip 安装,运行以下命令:
pip install psutil
获取进程状态和进程号
可以通过 psutil 模块的 process_iter()
方法获取正在运行的进程列表。以下是一个示例:
import psutil
for proc in psutil.process_iter():
try:
# 获取进程
p = psutil.Process(proc.pid)
# 获取进程命令
cmd = p.cmdline()
# 获取进程状态
status = p.status()
# 获取进程号
pid = p.pid
print(f"process cmd: {cmd}, status: {status}, pid: {pid}")
except (psutil.AccessDenied, psutil.NoSuchProcess):
pass
上述代码可以得到当前系统中所有进程的命令、状态和进程号。
记录重启时间
记录进程重启时间的一种方法是使用日志记录器。可以使用 Python 自带的日志模块实现。以下是一个示例:
import logging
import time
logging.basicConfig(
filename='process.log',
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('process')
while True:
try:
# 获取当前时间和进程号
now = time.time()
pid = psutil.Process(process_id).pid
# 如果进程号与上次不同,则记录重启时间
if pid != prev_pid:
logger.info(f'process {prev_pid} restarted at {time.ctime(prev_time)}')
prev_time = now
prev_pid = pid
time.sleep(1)
except psutil.NoSuchProcess:
# 进程已停止,结束循环
break
上述代码在不间断地运行时,如果进程号与上次不同,则记录重启时间。日志写入文件 process.log 中。
实例1 - 监控Python进程
以下是一个示例,可以使用 psutil 模块监控 Python 进程,并记录重启时间和进程号。
import logging
import psutil
import time
logging.basicConfig(
filename='python_process.log',
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('python_process')
while True:
try:
# 获取 Python 进程
process_name = 'python'
for proc in psutil.process_iter():
try:
p = psutil.Process(proc.pid)
if process_name in p.name():
process_id = p.pid
break
except (psutil.AccessDenied, psutil.NoSuchProcess):
pass
# 获取当前时间和进程号
now = time.time()
pid = psutil.Process(process_id).pid
# 如果进程号与上次不同,则记录重启时间
if pid != prev_pid:
logger.info(f'process {prev_pid} restarted at {time.ctime(prev_time)}')
prev_time = now
prev_pid = pid
time.sleep(1)
except psutil.NoSuchProcess:
# 进程已停止,结束循环
break
上述代码监控 Python 进程的重启,并将日志写入文件 python_process.log 中。
实例2 - 监控多进程并发
以下是一个示例,可以监控多进程 Python 程序并发执行的情况,记录每个进程号的重启时间和状态。
import logging
import psutil
import time
import multiprocessing as mp
logging.basicConfig(
filename='multi_python_process.log',
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('multi_python_process')
def process_monitor(process_id, prev_pid, prev_time):
while True:
try:
# 获取当前时间和进程号
now = time.time()
pid = psutil.Process(process_id).pid
# 如果进程号与上次不同,则记录重启时间
if pid != prev_pid:
logger.info(f'process {prev_pid} restarted at {time.ctime(prev_time)}')
prev_time = now
prev_pid = pid
# 获取进程状态
status = psutil.Process(process_id).status()
logger.info(f'process {pid} status: {status}')
time.sleep(1)
except psutil.NoSuchProcess:
# 进程已停止,结束循环
break
if __name__ == '__main__':
# 启动多个 Python 进程
processes = []
for i in range(5):
p = mp.Process(target=process_function, args=(i,))
p.start()
processes.append(p)
# 监控进程状态和重启时间
prev_pids = [-1] * 5
prev_times = [0] * 5
while True:
try:
for i, p in enumerate(processes):
# 获取 Python 进程的进程号
process_id = p.pid
# 如果进程号与上次不同,则记录重启时间
if process_id != prev_pids[i]:
logger.info(f'process {prev_pids[i]} restarted at {time.ctime(prev_times[i])}')
prev_times[i] = time.time()
prev_pids[i] = process_id
time.sleep(1)
except KeyboardInterrupt:
# 中断程序
break
# 结束 Python 进程
for p in processes:
p.terminate()
p.join()
上述代码监控多进程 Python 程序的重启和进程状态,并将日志写入文件 multi_python_process.log 中。可以修改进程数量和进程函数 process_function 来适应不同的需要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python监控进程状态,记录重启时间及进程号的实例 - Python技术站