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

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元组tuple相关原理

    让我们来详细讲解一下“简单了解Python元组(tuple)相关原理”的完整攻略。 什么是元组(tuple) 元组(tuple)是Python中的一种序列类型,可以理解为是不可变的列表,其元素按照顺序排列。元组内的元素可以是任意数据类型,包括数字、字符串、列表、元组等等。元组一旦被创建,就不能再进行修改。 元组的创建 我们可以使用圆括号()创建一个元组,元素…

    python 2023年5月14日
    00
  • 基于Python3.7.1无法导入Numpy的解决方式

    要解决基于Python3.7.1无法导入Numpy的问题,可以尝试以下两种方法: 方法一:更新pip并重新安装Numpy 首先,打开终端(Windows用户可使用命令提示符或PowerShell,Mac用户可使用终端),输入以下命令来更新pip: pip install –upgrade pip 然后,使用以下命令卸载已安装的Numpy: pip unin…

    python 2023年5月13日
    00
  • python2 与python3的print区别小结

    下面是“Python 2与Python 3的print区别小结”的详细攻略: 标准输出 在Python 2中,print语句被用于把文本输出到控制台: print ‘Hello, world!’ 在Python 3中,print变成了一个函数,需要用括号包含文本来输出: print(‘Hello, world!’) 打印变量 在Python 2中,可以简单地…

    python 2023年6月5日
    00
  • mac在matplotlib中显示中文的操作方法

    下面是在Mac上使用matplotlib显示中文的方法: 方法一:设置字体 步骤一:下载中文字体 在macOS系统中自带的中文字体较少,因此我们需要下载其他中文字体。可以从 这里 获取常用的中文字体,例如思源黑体和华文细黑。 步骤二:配置matplotlib 在绘图之前,需要在代码中设置字体,这可以通过以下两种方式实现: 直接指定字体路径 “`python…

    python 2023年5月20日
    00
  • python 猴子补丁(monkey patch)

    Python猴子补丁(Monkey Patch)是一种在运行时动态修改代码的技术。通常用于在不修改源代码的情况下,改变代码的执行方式或增加功能。在某些情况下,它可以是解决问题的有效方式,但是滥用这种技术可能会导致代码混乱和难以维护。 什么是猴子补丁? 在Python中,所有的变量和函数都存储在命名空间(Namespace)中。Python程序在执行时,会按照…

    python 2023年6月3日
    00
  • Python根据URL地址下载文件并保存至对应目录的实现

    实现Python根据URL地址下载文件并保存至对应目录的方法,可分以下几个步骤: 确定下载文件的URL地址 利用Python的urllib模块发送请求,获取服务器响应的内容 将获取到的内容写入文件 将写入的文件保存至指定的目录 下面是具体的实现步骤和示例说明 确定下载文件的URL地址 首先需要确定要下载的文件URL地址。可以从浏览器的开发者工具中查看元素,确…

    python 2023年6月3日
    00
  • 如何Tkinter模块编写Python图形界面

    下面是关于如何使用 Tkinter 模块编写 Python 图形界面的完整攻略: 1. Tkinter 简介 Tkinter 是 Python 的内置模块之一,用于创建图形用户界面(GUI)。使用 Tkinter 可以创建窗口、按钮、标签和文本框等常见的 GUI 组件,并将它们组合在一起,构建出复杂的 GUI 应用程序。 2. 窗口设计 在创建图形界面应用程…

    python 2023年5月18日
    00
  • 详解Python函数式编程—高阶函数

    Python函数式编程—高阶函数 什么是高阶函数 高阶函数指的是至少满足以下两个条件之一的Python函数: 接受一个或多个函数作为参数 返回一个函数 简单来说,高阶函数就是把函数当作参数或者返回值的函数。 函数作为参数 在Python中,函数可以作为另一个函数的参数。这种做法可以让我们的代码更加简洁、灵活。 下面是一个简单的例子,展示了如何将函数作为参数传…

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