利用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.hqwc.cn/news/491151.html

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

相关文章

力扣随笔之寻找重复数(中等287)

思路1:暴力解法,根据要求不修改数组且只用常量级O(1)的额外空间,我们写两层嵌套循环,寻找重复的数;可以解决部分问题,但会超出时间限制无论Java还是C; Java实现: class Solution {public int findDuplicat…

LeetCode--代码详解 235.二叉搜索树得最近公共祖先

235.二叉搜索树得最近公共祖先 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可…

设计模式-结构型模式-桥接模式

桥接模式(Bridge Pattern):将抽象部分与其实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。桥接…

linux 0.11 调试c代码

我们可以通过实验楼实验环境 来调试linux0.11的c代码。 cd ~/oslab/ tar -zxvf hit-oslab-linux-20110823.tar.gz -C ~ cd ~/oslab/linux-0.11/ make cd ~/oslab/ nohup ./dbg-c & nohup terminator & ls在新的窗口执行 ./rungdb,进入调试状态。 输入 set disassemb…

Selenium WebDriver + python 自动化测试框架

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

个人健康|个人健康管理小程序|基于微信小程序的个人健康管理系统设计与实现(源码+数据库+文档)

个人健康管理小程序目录 目录 基于微信小程序的个人健康管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 (1)用户信息管理 (2)运动教程管理 (3)公告…

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义:计算机网络是互连的、自治的计算机的集合。 2、协议的定义:协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法:定义实体之间交换信息的格式与结构,或…

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

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

创作纪念日:记录我的成长与收获

机缘 一开始是在我深入学习前端知识的Vue.js框架遇到了一个问题&#xff0c;怎么都解决不了&#xff0c;心烦意乱地来csdn上找解决方法。开心的是真被我找到了&#xff0c;真的很感恩&#xff0c;也意识到在这个平台上分享自己的经验是多么有意义的事情&#xff0c;可能随便的…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

QC七大工具

目录 1、检查表&#xff1a; 2、层别法&#xff1a; 3、柏拉图&#xff1a; 4、因果图&#xff1a; 5、散布图&#xff1a; 6、直方图&#xff1a; 7、控制图&#xff1a; QC是英文Quality Control的简称&#xff0c;中文意思是质量控制。在ISO9000:2015对质量管理&…

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…