利用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 timedef main():while True:print("-----monitor------")time.sleep(10)if __name__=="__main__":main()

定时打印内容;

test.py文件如下:

import os
import psutildef 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")continueif process_name != "python.exe":continueprint(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 Truereturn Falsedef 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脚本,如下图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次生产jvm oom问题

前言 jvm添加以下参数,发生OOM时自动导出内存溢出文件 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/opt 内存分析工具: MAT, 下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation, 注意工具地址…

让AI玩一千万次贪吃蛇

如果让人工智能来玩贪吃蛇游戏,会发生什么? 图源:DALLE 目录 贪吃蛇实现 游戏规则 游戏实现 Q学习算法实现 Q学习简介 Q表和Q值 Q学习更新规则 Q学习在贪吃蛇游戏中的应用 整体项目完整代码 运行过程截图 代码分析 环境设置 …

2024.2.23 C++QT 作业

思维导图 练习题 1>简单实现闹钟播报,设置时间,当系统时间与设置时间相同时播报语音5次,然后停止。如果设置时间小于当前系统时间,则弹出消息提示框,并清空输入框。 #include "widget.h" #include &quo…

JSON(javaScript Object Notation,Js对象标记)—我耀学IT

Json是一种轻量级的数据交换格式,目前使用非常广泛,是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换 。同时也易于机器解析和生成 1.1json的值: 值可以是对象、数组、数字、字符串或者三个字面值(false、nul…

什么是nginx 、安装nginx、nginx调优

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000~50 000个并发请求。 1.2 nginx模块与作用 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错…

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

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

【Java程序设计】【C00262】基于Springboot的会员制医疗预约服务管理系统(有论文)

基于Springboot的会员制医疗预约服务管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的会员制医疗预约服务管理信息系统,本系统分为三种角色:管理员、医生和会员; 在系统…

JavaSec 基础之 XXE

文章目录 XMLReaderSAXReaderSAXBuilderDocumentBuilderUnmarshaller**SAXParserFactory**XMLReaderFactoryDigester总结 XMLReader public String XMLReader(RequestBody String content) {try {XMLReader xmlReader XMLReaderFactory.createXMLReader();// 修复&#xff1a…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机,大约消耗0.3度电。 一般一台电脑的功耗约为250-400W(台式机)。 一台电脑每月的耗电量:如果是每小时300W每天10小时每月30天90KW,即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段,应用服务通常是部署在开发环境,在有数据回调的开发场…

【MATLAB】 RLMD信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 RLMD分解算法 RLMD(Robust Local Mode Decomposition)是一种鲁棒的局部模态分解方法。它是通过在局部区间内对信号进行多项式拟合,提取局部特征,进而分解信…

【Java程序设计】【C00294】基于Springboot的车辆充电桩管理系统(有论文)

基于Springboot的车辆充电桩管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的车辆充电桩管理系统 本系统前台功能模块分为:首页功能和用户后台管理 后台功能模块分为:管理员功能和…

达梦数据库搭建和连接(详解一文看懂)

达梦数据库搭建和连接 一、数据库搭建1.安装前准备2.下载 Docker3.导入安装包4.启动docker版docker-compose版 5.启动/停止数据库 二、数据库连接1、下载DBeaver2、下载驱动3、DBeaver新建驱动数据库-驱动管理器新建驱动创建新驱动设置创建驱动-库驱动类确定和关闭 4、连接 博主…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

[VulnHub靶机渗透] FourandSix2.01

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

stm32单片机的智能手环-心率-步数-距离-体温-蓝牙监控

一.硬件方案 随着社会的发展,人们的物质生活水平日渐提高,人们也越来越关注自己的健康。智能手环作为一种测量仪器,可以计算行走的步数和消耗的能量,所以人们可以定量的制定运动方案来健身,并根据运行情况来分析人体的…

7.(数据结构)堆

7.1 相关概念 堆(Heap)在计算机科学中是一种特殊的数据结构,它通常被实现为一个可以看作完全二叉树的数组对象。以下是一些关于堆的基本概念: 数据结构: 堆是一个优先队列的抽象数据类型实现,通过完全二叉树…

AI工具新革命:从ChatGPT到Sora,生成式AI改变世界

这个春节着实精彩,“春山学”吃透了,不如把目光移向OpenAI又一重磅产品——文生视频大模型Sora。智能新纪元已然开启,因为正如周鸿祎所说:“,Sora的诞生意味着AGI(通用人工智能)的实现将从10年缩短到1年。”…

.netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项

1、SqlSugarCore 相关 1.1 主项目添加数据&#xff0c;否则会报数据库连接错误&#xff1a; <InvariantGlobalization>false</InvariantGlobalization> <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</…

二维码(CTF)misc

知识点&#xff1a;文件剥离zip密码爆破 用到了fcrackzip工具&#xff1a; -b :采用爆破的方式 -c :采用什么类型的密码&#xff0c;1 数字类型 a 小写字母 A 大写字母 ‘aA1’ 大小写字母数字混合等 -l :指定密码的位数 -u :过滤掉不正确的密码记录&#xff1b;只显示正…