脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python实现监控一个程序的运行情况

Python实现监控一个程序的运行情况

2023-05-11 14:10风吹落叶花飘荡 Python

这篇文章主要为大家介绍了Python如何实现监控一个程序的运行情况,然后视情况将进程杀死并重启,文中的示例代码简洁易懂,需要的可以参考一下

一、前言

在使用selenium库爬取一些小东西,经常出现程序进入死循环的情况。导致一个简简单单的需求,居然花了3天没跑完,很是气愤。遂给写了一个监听程序,当爬虫死机一定时间的时候,就把这只爬虫拍死,然后根据日志从上次爬的地方重启一只新爬虫。

二、使用psutil库和subprocess库介绍

当涉及到与操作系统进行交互的时候,Python中的 psutil 和 subprocess 库都是非常有用的工具。

1.psutil 库

psutil(process and system utilities)是一个跨平台的库,提供了许多有用的系统和进程信息。通过 psutil 库,我们可以轻松地获取操作系统的各种信息,如 CPU 使用情况、内存使用情况、磁盘使用情况等等。此外,psutil 还可以用于获取和操作进程信息,如获取进程的 CPU 使用情况、内存使用情况、打开的文件和网络连接等等。

以下是 psutil 库的一些主要功能:

  • 获取 CPU 使用率、内存使用率、磁盘使用情况、网络信息等等。
  • 获取系统启动时间、用户数、主机名等等系统信息。
  • 获取进程的 PID、CPU 使用情况、内存使用情况、线程数等等信息。
  • 操作进程,如发送信号、终止进程等等。

2.subprocess 库

subprocess 库是用于在 Python 程序中执行外部命令的标准库。通过 subprocess 库,我们可以启动一个子进程来执行外部命令,然后在 Python 程序中捕获并处理该命令的输出。subprocess 库提供了多个函数,如 Popen、call、check_call 等等,以便于我们执行外部命令和处理命令的输出。

以下是 subprocess 库的一些主要功能:

  • 启动子进程并执行外部命令。
  • 在子进程中捕获并处理命令的输出。
  • 设置子进程的环境变量、工作目录等等属性。
  • 通过管道连接多个子进程,从而实现数据流的处理。

总之,psutil 和 subprocess 是 Python 中非常有用的库,可以帮助我们轻松地获取和操作系统和进程的各种信息,以及执行外部命令和处理命令的输出。在编写需要与操作系统进行交互的 Python 程序时,这两个库是不可或缺的。

三、使用psutil库和subprocess库示例程序

要监控一个程序的运行情况并在需要时将其杀死并重启,可以使用 Python 的 psutil 模块来实现。psutil 模块可以访问系统进程和系统资源的信息,并提供了一些操作系统的 API 接口。具体来说,我们可以使用 psutil 模块来获取程序的 PID(进程ID),并在需要时将进程杀死并重启。

下面是一个简单的示例,演示了如何使用 psutil 模块监控程序的运行情况,并在需要时将进程杀死并重启:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import psutil
import subprocess
import time
 
# 启动程序
p = subprocess.Popen(['python', 'your_program.py'])
 
while True:
    # 检查程序是否在运行
    if psutil.pid_exists(p.pid) and psutil.pid_exists(p.pid) in psutil.pids():
        # 如果程序在运行,等待一段时间后再检查
        time.sleep(5)
    else:
        # 如果程序已经退出,重启程序
        p = subprocess.Popen(['python', 'your_program.py'])

在这个示例中,我们首先使用 subprocess.Popen() 启动程序,并获取程序的 PID。然后在一个无限循环中,不断检查程序是否在运行。如果程序在运行,我们会等待一段时间后再检查。如果程序已经退出,我们就使用 subprocess.Popen() 重新启动程序。这样,即使程序崩溃了,也能够在很短的时间内重新启动。

需要注意的是,在监控程序运行情况时,要确保程序出现异常不会导致系统崩溃或造成严重影响。如果程序出现无限循环、内存泄漏等问题,监控程序可能只会让问题变得更加严重。因此,在编写监控程序时,要确保程序本身是健壮的,并且程序出现异常时能够正确地退出。另外,要注意不要在监控程序中占用过多的系统资源,以免影响其他程序的正常运行。

四、多进程通信

在 Python 中,可以使用 multiprocessing 库来实现不同进程之间的交互。multiprocessing 是 Python 标准库中的一个模块,它允许我们启动并发进程,以便于同时执行多个任务。

在这里,由于需求不是很复杂,我用了一个取巧的方法,就是用一个txt文件当作中介,也可以了理解为池子,程序往里面丢日志。然后重启的时候根据日志也就是爬到第几个了,断点重续。

下面程序功能是:当程序imgico.py50s不更新的时候,重启。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import psutil
import subprocess
import time
# 启动程序
p = subprocess.Popen(['python', 'imgico.py'])
preendNum=2
count=0
while True:
    # 检查程序是否在运行
    time.sleep(5)
    if psutil.pid_exists(p.pid) and psutil.pid_exists(p.pid) in psutil.pids():
        # 如果程序在运行,等待一段时间后再检查
        time.sleep(5)
    else:
        # 如果程序已经退出,重启程序
        p = subprocess.Popen(['python', 'imgico.py','--begin',str(endNum)])
    with open('cache.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        if len(lines)==0:
            endNum=2
        endNum = lines[len(lines) - 1].replace('\n', '')
 
    if preendNum==endNum:
        count+=1
    else:
        preendNum = endNum
        count=0
    if count==10:
        print('重启一次!'+str(count))
        p = subprocess.Popen(['python', 'imgico.py', '--begin', str(endNum)])
        count=0

到此这篇关于Python实现监控一个程序的运行情况的文章就介绍到这了,更多相关Python监控程序内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_51116518/article/details/130530501

延伸 · 阅读

精彩推荐
  • Python解决Pycharm无法import自己安装的第三方module问题

    解决Pycharm无法import自己安装的第三方module问题

    今天小编就为大家分享一篇解决Pycharm无法import自己安装的第三方module问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    zhujianing^_^5172021-02-22
  • PythonPython中时间datetime的处理与转换用法总结

    Python中时间datetime的处理与转换用法总结

    今天小编就为大家分享一篇关于Python中时间datetime的处理与转换用法总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一...

    gavenyeah12412021-05-29
  • Pythonpython实现模拟器爬取抖音评论数据的示例代码

    python实现模拟器爬取抖音评论数据的示例代码

    这篇文章主要介绍了python实现模拟器爬取抖音评论数据的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    weixin_434856698282021-08-22
  • Pythonpython中__init__()方法详情

    python中__init__()方法详情

    这篇文章主要介绍了 python中__init__()方法详情,python类中定义的函数称为方法, init ()方法本质也是一个函数。这个函数的作用是初始化实例后的对象,具体...

    代号零零一9452022-03-09
  • Pythonpython中比较两个列表的实例方法

    python中比较两个列表的实例方法

    在本篇文章里小编给各位分享了关于python中比较两个列表的实例方法以及相关代码,需要的朋友们参考下。...

    10902021-07-31
  • PythonPython利用shutil实现拷贝文件功能

    Python利用shutil实现拷贝文件功能

    shutil 是一个 Python 内置模块,该模块对文件的复制、删除和压缩等操作都提供了非常方便的支持。本文将利用shutil实现拷贝文件功能,需要的可以参考一下...

    古明地觉9612022-07-22
  • Pythonpython处理csv数据的方法

    python处理csv数据的方法

    这篇文章主要介绍了python处理csv数据的方法,实例分析了Python处理csv数据的技巧,需要的朋友可以参考下 ...

    kirkversion14702019-11-27
  • Pythonpython中的__dict__属性介绍

    python中的__dict__属性介绍

    这篇文章主要介绍了python中的__dict__属性介绍,首先通过将字典转换成对象的小技巧,展开标题介绍,具有一定的参考价值,下文具体的相关介绍需要的小...

    公子清羽5082022-12-07