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

news2024/9/23 7:32:01

摘要

如果要判断某一脚本是否在运行,可以通过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脚本,如下图

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

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

相关文章

Optimization for Deep Learning

Notations: : model parameters at time step or : gradient at used to compute : momentum accumulated from time step to time step , which is used to cpmpute Optimization What is Optimization about? 找到一组参数,使得 最小,或者说是…

内容安全补充

第十一天 密码学 近现代加密算法 古典加密技术 --- 算法保密原则 近现代加密技术 --- 算法公开,密钥保密 对称加密算法,非对称加密算法 对称加密 --- 加密和解密的过程中使用的是同一把密钥。 所以,对称加密所使用的算法一定是一种双向…

概率基础——指数分布

概率基础——指数分布 介绍 指数分布是一种连续概率分布,描述了独立随机事件之间的时间间隔。它常被用来模拟随机事件的等待时间,例如到达下一位顾客的等待时间、设备故障的间隔时间等。指数分布具有无记忆性的特点,即在给定时间内没有发生…

*MYSQL--索引--内部原理

MYSQL的索引根据功能,主要有三大类型: 1.HASH索引 2.二叉树 3.BTREE索引 一:HASH索引 1.内部原理: 在设置了某列为索引列之后,并且开始或者将要在相应索引列创建数据的时候,系统通过某种算法 F(X) 自动计算出来一个十六进制的哈希值,这个哈希值能够对应相应的字段值 所以…

单片机51 输入和输出

一、IO口基本概念介绍 单片机的IO口(Input/Output口)是连接单片机与外部电路或设备的接口。单片机的IO口可以分为输入口和输出口两种,用于控制和监测外部设备的状态。 1. 输入口:单片机的输入口用于接收外部电路或设备的信号。输…

C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串

#include<iostream> using namespace std; #include <string> //string的构造函数 /* -string(); //创建一个空的字符串 例如: string str; -string(const char* s); //使用字符串s初始化 -string(const string& str); //使…

Linux安装jdktomcatMySQl一战完成

一、jdk安装具体步骤 1、查询是否有jdk java -version 2、进入opt目录 cd /opt/ 连接服务器工具 进入opt目录&#xff0c;把压缩文件上传 查询是否查询成功 进入解压到的目录 cd /usr/local/创建新文件夹 mkdir java 再回到opt目录进行解压 cd /opt 解压到刚刚创建的文…

springboot邮箱注册

1.准备工作 操作之前准备两个邮箱 我准备了网易邮箱和QQ邮箱&#xff0c;网易邮箱用来发送验证码&#xff0c;QQ邮箱用来做注册&#xff08;希望大家和我一样&#xff0c;不然可能会出错 &#xff09; 发送验证码的邮箱需要开启一些设置&#xff0c;否则不…

CSS 字体和文本详解

CSS 字体和文本详解 字体设置 如果字体名有空格&#xff0c;使用引号包裹。建议使用常见字体&#xff0c; 否则兼容性不好。字体名称可以用英文&#xff0c;也可以用中文&#xff0c; 推荐使用英文。 示例代码: 运行结果: 字体大小 不同的浏览器默认字号不一样&#xff0c;…

多线程相关(4)

线程安全-下 使用层面锁优化减少锁的时间&#xff1a;减少锁的粒度&#xff1a;锁粗化&#xff1a;使用读写锁&#xff1a;使用CAS&#xff1a; 系统层面锁优化自适应自旋锁锁消除锁升级偏向锁轻量级锁重量级锁 ThreadLocal原理ThreadLocal简介原理ThreadLocal内存泄漏 HashMap…

15-36V降压充电光伏MPPT充电方案

1.MPPT原理--简介 MPPT&#xff0c;全称为Maximum Power Point Tracking&#xff0c;即最大功点跟踪&#xff0c;它是一种通过调节电气模块的工作状态&#xff0c;使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中&#xff0c;可有效地…

【Langchain多Agent实践】一个有推销功能的旅游聊天机器人

【LangchainStreamlit】旅游聊天机器人_langchain streamlit-CSDN博客 视频讲解地址&#xff1a;【Langchain Agent】带推销功能的旅游聊天机器人_哔哩哔哩_bilibili 体验地址&#xff1a; http://101.33.225.241:8503/ github地址&#xff1a;GitHub - jerry1900/langcha…

从软硬件以及常见框架思考高并发设计

目录 文章简介 扩展方式 横向扩展 纵向扩展 站在软件的层面上看 站在硬件的层面上看 站在经典的单机服务框架上看 性能提升的思考方向 可用性提升的思考方向 扩展性提升的思考方向 文章简介 先从整体&#xff0c;体系认识&#xff0c;理解高并发的策略&#xff0c;方…

xff注入 [CISCN2019 华东南赛区]Web111

打开题目 看见smarty 想到模板注入 又看见ip 想到xff注入 一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。该题目的Smarty版本是3.1.30 在Smarty3的官方手册里有以下描述: Smarty已经废弃{php}标签&#xff0c;强烈建议不要使用。在Smarty 3.1&#xff…

vue实现递归组件

父组件&#xff1a; <Tree :data"data"></Tree> import Tree from "/components/Tree.vue"; const data reactive([{name: "1",checked: true,children: [{name: "1-1",checked: false,},],},&#xff09; 子组件&#…

电脑闹钟软件哪个好用?

电脑闹钟软件哪个好用&#xff1f;一款带有闹钟定时提醒的备忘录软件是比较实用的&#xff0c;很多上班族每天都要处理堆积如山的工作&#xff0c;总是会忙于一件事的时候忘记另外一件事&#xff0c;导致效率极低。如当一项重要会议需要提前准备资料时&#xff0c;我们却忙于其…

【大厂AI课学习笔记NO.51】2.3深度学习开发任务实例(4)计算机视觉实际应用的特点

今天考试通过腾讯云人工智能从业者TCA级别的认证了&#xff01; 还是很开心的&#xff0c;也看不到什么更好的方向&#xff0c;把一切能利用的时间用来学习&#xff0c;总是对的。 我把自己考试通过的学习笔记&#xff0c;都分享到这里了&#xff0c;另外还有一个比较全的思维…

Java 模糊查询不用like,还可以用什么实现

在电商项目中&#xff0c;如果模糊查询用like的话&#xff0c;会给服务器带来很大的压力&#xff0c;导致服务器崩溃这都是有可能的&#xff0c;最开始做电商搜索框的时候&#xff0c;告诉我不可以用like&#xff0c;这对我来说&#xff0c;简直就是在为难我啊&#xff0c;可能…

Opencv实战(2)绘图与图像操作

Opencv实战(2)绘图与图像操作 指路前文&#xff1a;Opencv实战(1)读取与像素操作 三、基本绘图 文章目录 Opencv实战(2)绘图与图像操作三、基本绘图(1).line(2).rectangle(3).circle 四、图像处理(1).颜色空间1.意义2.cvtColor()3.inRange()4.适应光线 (2).形态操作1.腐蚀2.膨…

[VulnHub靶机渗透] FourandSix2.01

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …