python监控进程状态,记录重启时间及进程号的实例

yizhihongxing

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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python中带有直方图的高级掷骰子模拟器

    【问题标题】:advanced dice roll simulator w/ histogram in pythonpython中带有直方图的高级掷骰子模拟器 【发布时间】:2023-04-01 02:19:02 【问题描述】: 我正在编写一个程序,询问用户骰子的数量和骰子的边数。它计算每个值滚动了多少次,然后将它们放在一个列表中。然后我必须打印列表以及百分…

    Python开发 2023年4月8日
    00
  • Python 使用有限迭代器

    Python中的有限迭代器 (finite iterator) 指的是一次性的迭代器,即使用后就不能再次迭代。一些Python内置的函数(如sorted和max)以及一些外部库(如pandas和numpy)也提供了一些有限迭代器。 Python有限迭代器主要有以下几种类型: zip(): 这个函数可以接受任意多个可迭代对象,将它们中对应的元素打包成一个元组(…

    python-answer 2023年3月25日
    00
  • python开发简单的命令行工具简介

    Python开发简单的命令行工具简介 简介 命令行工具是一种基于文本交互的工具,可以使用户更方便地执行一些复杂的操作。Python提供了很多模块和工具来帮助我们开发命令行工具,比如argparse,click,docopt等。 使用argparse模块开发命令行工具 安装 argparse是Python标准库的一部分,所以不用额外安装。 示例 import …

    python 2023年5月30日
    00
  • Python的输入,输出和标识符详解

    Python的输入 在Python中,我们可以使用input()函数来获取用户的输入,这个函数返回一个字符串类型的值。 示例代码: name = input("请输入你的名字:") print("你好," + name + "!") 运行结果: 请输入你的名字:小明 你好,小明! 在这个示例中,我们…

    python 2023年5月13日
    00
  • 用python修改excel表某一列内容的操作方法

    下面给出一个用Python修改Excel表某一列内容的完整实例教程。 准备工作 首先需要安装Python的pandas库和openpyxl库。 pip install pandas openpyxl 然后需要准备一个Excel表格,在这个例子中我们使用一个示例表格 example.xlsx,该表格有三列数据:id、name和 age,其中 id 是整型,na…

    python 2023年5月13日
    00
  • Python+logging输出到屏幕将log日志写入文件

    当我们编写Python程序时,经常需要记录程序的运行状态、异常情况等信息。为此,我们可以使用logging模块进行日志输出和记录。logging模块提供了灵活的日志级别、输出格式和输出位置的配置方式,能够满足我们不同应用场景中的需求。 本文将讲解如何使用Python logging模块,实现将日志信息同时输出到屏幕和写入日志文件的功能。 步骤一:导入logg…

    python 2023年6月5日
    00
  • Python实现SVN的目录周期性备份实例

    Python实现SVN的目录周期性备份实例 问题描述 在软件开发的过程中,代码是非常重要的资产。为了保障代码的安全,需要对代码进行定期备份。 本篇文章主要介绍如何使用Python对SVN目录进行周期性备份,以保障代码的安全性。 解决方法 1. 安装SVN和Python 在进行备份前,需要先安装SVN和Python。具体的安装过程可以参考相关的安装教程。 2.…

    python 2023年6月3日
    00
  • python使用tkinter模块实现文件选择功能

    下面就是使用 Python 的 tkinter 模块实现文件选择功能的完整攻略。 一、Tkinter 的介绍 Tkinter 是 Python 中最常用的 GUI 工具包,其提供了一组面向对象的 Python 绑定,可以让程序员在 Python 中使用 Tcl/Tk 的 GUI 能力。Tkinter 相对于其他 Python GUI 工具包有着广泛的口碑和期…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部