利用psutil库检查脚本是否在运行

摘要

如果要判断某一脚本是否在运行,可以通过psutil库获取所有进程的cmdline,并判断指定的文件名是否在cmdline中。

目录

1.psutil库简介

2.检查代码及说明

2.1检查思路

2.2异常捕获

2.3执行方法


1.psutil库简介

psutil 是一个跨平台(Linux, Windows, macOS)的 Python 库,用于检索系统运行的进程和系统利用率(CPU、内存、磁盘等)的详细信息。这个模块可以帮助你获取系统资源和性能的数据,非常适合进行系统监控、调试和分析。
以下是 psutil 模块的一些主要功能:

  • 获取进程信息:可以检索到系统中运行的进程列表,包括进程ID(PID)、进程名称、内存使用情况、CPU使用情况、进程的启动时间、运行状态、使用的命令行参数等。
  • 获取系统信息:可以获取到系统的总体信息,比如操作系统版本、处理器信息、物理内存和交换内存的使用情况、系统运行时间等。
  • 进程树:可以构建进程树,显示进程之间的父子关系。
  • 网络统计:可以获取到进程的网络连接信息,包括发送和接收的数据量、连接的远程地址等。
  • 用户统计:可以查看不同用户运行的进程以及它们对系统资源的使用情况。
  • 磁盘使用情况:可以查看磁盘分区的使用情况,包括已使用空间、可用空间、挂载点等。
  • 环境变量:可以获取进程的环境变量。
  • 线程信息:可以获取进程中的线程信息,包括线程ID、线程名、线程的CPU使用情况等。
  • 杀死进程:可以发送信号给进程,比如终止进程。

2.检查代码及说明

编写test.py文件,主要运行检查逻辑,检查的目标脚本是monitor.py文件,

其中monitor.py文件如下:

import time

def main():
    while True:
        print("-----monitor------")
        time.sleep(10)

if __name__=="__main__":
    main()

定时打印内容;

test.py文件如下:

import os
import psutil

def check_script_running(script_name):
    for pid in psutil.pids():
        try:
            process=psutil.Process(pid)
            cmdlines=list(process.cmdline())
            process_name=process.name()
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            print("exception")
            continue
        
        if process_name != "python.exe":
            continue
        print(f"pid={pid}, name={process_name}, cmdline={cmdlines}")
        for cur_ret in cmdlines:
            if script_name in cur_ret:
                print(f"check script pid={pid}")
                return True
    return False

def restart_script(script_path):
    os.popen(f"python {script_path}")


    
if __name__=="__main__":
    
    root_path=os.path.dirname(os.path.abspath(__file__))
    check_file_name="monitor.py"
    run_script_file=os.path.join(root_path, check_file_name)


    if not check_script_running(check_file_name):
        restart_script(run_script_file)
        print(f"检测到{check_file_name}脚本未运行,已重启{run_script_file}")
    else:
        print(f"{check_file_name}脚本正常运行")

2.1检查思路

check_script_running函数中没有通过进程名来判断脚本是否运行,因为一台设备上可能同时运行了多个python脚本,这些脚本的进程名都是python.exe,无法判断指定脚本是否运行。而
psutil 库中的 getcmdline() 函数用于获取进程的命令行参数。这个函数返回一个字符串列表,其中包含了启动进程时传递给它的所有命令行参数。而在命令行参数中会有执行的python脚本的文件名,从而可以判断目标脚本是否在运行。

restart_script函数中使用了比较老旧的os.popen函数,而不是比较新的subprocess中的run和Popen函数,因为在调试过程中,发现subprocess的函数都会阻塞test.py所在的进程,由于monitor脚本中是死循环,这个进程会一直阻塞下去。这不符合业务要求,因此改用了非阻塞的os.popen函数。

2.2异常捕获

check_script_running在运行中,捕获了三个异常:

  • psutil.NoSuchProcess: 这个异常发生在尝试访问一个不存在的进程时。这可能是因为进程的PID已经改变(例如,因为另一个进程使用了相同的PID),或者是因为进程已经终止并且PID不再有效。在Linux上,PID 1通常是 init 进程,它永远不会终止,因此永远不会遇到这个异常。
  • psutil.AccessDenied: 当尝试访问一个进程但权限不足时,会抛出这个异常。例如,你可能尝试访问一个由其他用户拥有的进程,或者尝试访问一个受保护的系统进程。在某些情况下,你可能需要管理员权限来访问特定的进程信息。
  • psutil.ZombieProcess: 这个异常发生在尝试访问一个僵尸进程时。僵尸进程是一个已经结束但仍然在进程表中占有一个条目的进程。在Unix-like系统中,僵尸进程会被父进程删除,但如果父进程没有正确处理僵尸进程(例如,父进程崩溃),那么僵尸进程可能会保留下来。

2.3执行方法

如果在vscode中运行test脚本,会发现每次运行,都会判断monior脚本未运行,然后重启,如下图

这是因为 VS Code 的 Python 扩展通常会在运行脚本时创建一个主进程,该主进程负责执行脚本,并且会在主进程结束后终止所有相关的子进程。
这种行为是为了确保在调试或运行过程中不会留下任何未终止的子进程,以避免资源泄漏或其他问题。

因此,要正确验证效果,需要在命令行中启动test.py脚本,如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/409208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接:https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在…

【Unity】提示No valid Unity Editor liscense found.Please active your liscense.

有两个软件,如果只有一个,点黑的不会有效果、、、、(楼主是这个原因,可以对号入座一下) 简而言之,就是去下载Unity Hub,再里面激活管理通行证 问题情境: 点击unity出现以下弹窗&a…

防御保护--入侵防御系统IPS

目录 DFI和DPI技术 --- 深度检测技术 入侵防御(IPS) 签名 入侵防御策略的配置 内容安全:攻击可能只是一个点,防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI--深度包检测技术--主要针对完整的数据包&#xff0…

操作符详解3

✨✨ 欢迎大家来到莉莉的博文✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作 符,今天继续介绍一部分。 目录 1.操作符的分类 2…

typescript 类型声明文件

typescript 类型声明文件概述 在今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。这些第三方库不管是否是用TS编写的,最终都要编译成JS代码,才能发布给开发者使用。6我们知道是TS提供了类型,才有了代码提示和类型保护等机…

K8S—集群调度

目录 前言 一 List-Watch 1.1 list-watch概述 1.2 list-watch工作机制 二 集群调度 2.1 调度过程 2.2 Predicate 和 Priorities 的常见算法和优先级选项 2.3 调度方式 三 亲和性 3.1 节点亲和性 3.2 Pod 亲和性 3.3 键值运算关系 3.4 Pod亲和性与反亲和性 3.5 示例…

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…

Python及Pycharm专业版下载安装教程(Python 3.11版)附JetBrains学生认证教程

目录 一、Python下载及安装1、Python下载2、Python安装3、验证是否安装成功 二、PyCharm下载及安装1、PyCharm下载2、PyCharm安装3、激活PyCharm 三、JetBrains学生认证 本篇主要介绍Python和PyCharm专业版的下载及安装方式,以及通过两种方式进行JetBrains学生认证。…

Meta AI | 指令回译:如何从大量无标签文档挖掘高质量大模型训练数据?

Meta AI | 指令回译:如何从大量无标签文档挖掘高质量大模型训练数据? 文章来自Meta AI,self-Alignment with Instruction Backtranslation[1]:通过指令反向翻译进行自对准。 一种从互联网大量无标签数据中挖掘高质量的指令遵循数据…

vscode 设置打开中断的默认工作目录/路径

vscode 设置打开终端的默认工作目录/路径** 文章目录 vscode 设置打开终端的默认工作目录/路径**打开vscode,打开设置UI 或是设置JSON文件,找到相关设置项方式1:通过打开settings.json的UI界面 设置:方式2:通过打开设置settings.j…

机器学习基础(六)TensorFlow与PyTorch

导语:上一节我们详细探索了监督与非监督学习的结合使用。,详情可见: 机器学习基础(五)监督与非监督学习的结合-CSDN博客文章浏览阅读4次。将监督学习和非监督学习结合起来,就像将两种不同的艺术形式融合&a…

[树形DP] 树的最大独立集

题目 这个挺简单的&#xff0c;注意状态转移时&#xff0c;如果选这个点&#xff0c;那么它的子结点状态应该为不选&#xff0c;如果这个点的状态是不选&#xff0c;那么可以在它的子结点里选择&#xff1a;选/不选两个状态&#xff0c;所以最后结果是max挑选。 #include<b…

python自动化管理和zabbix监控网络设备(有线网络配置部分)

目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name huawei revision-level 1 instance…

vue2和vue3 setup beforecreate create生命周期时间比较

创建一个vue程序&#xff0c;vue3可以兼容Vue2的写法&#xff0c;很流畅完全没问题 写了一个vue3组件 <template><div></div> </template><script lang"ts"> import {onMounted} from vue export default{data(){return {}},beforeCr…

深入理解JS的执行上下文、词法作用域和闭包(中)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

现在学Oracle是49年入国军么?

今天周末&#xff0c;不聊技术&#xff0c;聊聊大家说的最多的一个话题 先说明一下&#xff0c;防止挨喷&#x1f606; 本人并不是职业dba&#xff0c;对数据库就是爱好&#xff0c;偶尔兼职&#xff0c;以下仅个人观点分析&#xff0c;如有不同观点请轻喷&#xff0c;哈哈&…

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

《嵌入式工程师自我修养/C语言》系列——由浅入深夯实ARM汇编基础&#xff0c;汇编指令及寻址方式梳理&#xff08;附示例&#xff09;&#xff01; 一、引言二、ARM汇编语言2.1 ARM汇编的特点2.2 ARM指令集格式标准2.2.1 机器指令格式2.2.2 汇编指令格式 三、ARM寻址方式3.1 立…

【Android安全】Windows 环境下载 AOSP 源码

准备环境 安装 git 安装 Python 硬盘剩余容量最好大于 100G 打开 Git Bash&#xff0c;用 git 克隆源代码仓库 git clone https://android.googlesource.com/platform/manifest.git //没有梯子使用清华源 git clone https://aosp.tuna.tsinghua.edu.cn/platform/manifest.git…

174基于matlab的雷达数字信号处理

基于matlab的雷达数字信号处理。该程序具备对雷达目标回波的处理能力&#xff0c;能够从噪声中将目标检测出来&#xff0c;并提取目标的距离、速度、角度信息。有相应的试验文档。程序已调通&#xff0c;可直接运行。 174 雷达数字信号处理 目标检测出来 (xiaohongshu.com)

半导体物理基础-笔记(续)

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 掺杂半导体的费米能级与温度及杂质浓度的关系图 在温度一定的条件下&#xff0c;施主杂质浓度越高&#xff0…