百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

厉害了,监控程序 监控系统程序

itomcoil 2024-12-23 11:08 27 浏览

厉害了,监控程序


在程序员的生活中,往往会见识到很多高大上的程序;这两天做项目,需要做一个监控C++程序是否运行的,并且程序挂掉后需要自动重启程序;第一个想到的方案是监控进程,但是重新启动程序,却并不是那么容易;好在我们平时一直接触一门强大的“胶水”语言——python,可以完美的完成这两个任务,监控可重启。


思路: 1.启动定时线程 2.检测进程是否存在 3.不存在则启动程序


接下来,我们看看相关需要用到的知识点: 一、Tasklist命令 “Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。

它的使用格式为: TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]

参数列表: /S system 指定连接到的远程系统(IP)。 /U [domain]user 指定使用哪个用户执行这个命令。 /P [password] 为指定的用户指定密码。 /M [module] 列出调用指定的 DLL 模块的所有进程。 如果没有指定模块名,显示每个进程加载的所有模块。 /SVC 显示每个进程中的服务。 /V 指定要显示详述信息。 /FI filter 显示一系列符合筛选器指定的进程。 /FO format 指定输出格式,有效值: "TABLE"、"LIST"、"CSV"。 /NH 指定栏标头不应该在输出中显示。 只对 "TABLE" 和 "CSV" 格式有效。

1、 使用“Tasklist”命令查看本机进程 运行“命令提示符”程序,在提示符窗口中输入:“tasklist”命令,这样就显示本机的所有进程。本机的显示结果由五部分组成:图像名(进程名)、PID、会话名、会话#、内存使用。

2、 查看远程系统的进程 在命令提示符下输入: “tasklist /s 218.22.123.26 /u jtdd /p 12345678”(不包括引号)

其中/s参数后的“218.22.123.26”指要查看的远程系统的IP地址; /u后的“jtdd”指tasklist命令使用的用户帐号,它是远程系统上的一个合法帐号; /p后的“12345678”指jtdd帐号的密码,。 这样,通过上面的命令,我们就可以查看到远程系统的进程了。

小提示:使用tasklist命令查看远程系统的进程时,需要远程机器的RPC 服务器的支持,否则,该命令就不能正常使用。 3、 查看系统进程提供的服务 tasklist命令不但可以查看系统进程,而且还可以查看每个进程提供的服务。 如查看本机的进程“SVCHOST.EXE”提供的服务,在命令提示符下输入:

“tasklist /svc”命令即可,你会惊奇的发现,有四个“SVCHOST.EXE”进程,原来有二十几项服务使用这个进程,对于远程系统来说,查看系统服务也很简 单,使用” tasklist /s 218.22.123.26 /u jtdd /p 12345678 /svc”命令,就可以查看IP地址为“218.22.123.26”的远程系统进程所提供的服务。

4、 查看调用DLL模块文件的进程列表 例如,我们要查看本地系统中哪些进程调用了“shell32.dll” DLL模块文件。 在命令提示符下输入: tasklist /m shell32.dll 这时系统将显示调用进程列表。

5、 使用筛选器查找指定的进程 在命令提示符下输入: “TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running“ 这样就列出了系统中正在运行的非“SYSTEM“状态的所有进程。 其中" /FI “为筛选器参数," ne “ 和" eq “为关系运算符”不相等“和”相等“。 [补充] 谈到“Tasklist”命令,我们就不得不提它得孪生兄弟" taskkill "命令,顾名思义,它是用来杀死进程的。 如要杀死本机的 " notepad.exe "进程。 首先,使用Tasklist查找它的PID,系统显示本机" notepad.exe "进程的PID值为" 1132 ",然后运行" taskkill /pid 1132 "即可,或者运行" taskkill /IM notepad.exe "也可; 其中" /pid "参数后面跟要终止进程的PID值," /IM “参数后面为进程的图像名。

查找java进程就是 tasklist /fi "imagename eq java.exe"

很奇怪这里的的进程是imagename.

用tasklist /?可以查看帮助。

c:> tasklist /fi "IMAGENAME eq pop3svc.exe" This command returned the following information:

Image Name PID Session Name Session# Mem Usage POP3Svc.exe 3044 RDP-Tcp#9 0 2,072 K

========================================================

c:> tasklist /fi "PID eq 2500"

Image Name PID Session Name Session# Mem Usage inetinfo.exe 2500 RDP-Tcp#9 0 5,584 K

======================================================== 二、subprocess 库(python)

subprocess

在Python中,提供了subprocess模块,通过这个模块中的相应API,
就可以开启一个子进程来执行相应的脚本来完成这个操作。 
可以通过subprocess中的Popen类来处理这个命令。
即允许你去创建一个新的进程让其执行另外的程序,
并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。

popen类

subprocess模块定义了一个Popen类,通过它可以创建进程,并与其进行复杂的交互。

__init__(self, args, bufsize=0, executable=None, 
stdin=None, stdout=None, stderr=None, preexec_fn=None, 
close_fds=False, shell=False, cwd=None, env=None, 
universal_newlines=False, startupinfo=None, 
creationflags=0)
?

下面是参数的意思:

参数作用args一般是一个字符串,是要执行的shell命令内容bufsize设置缓冲,负数表示系统默认缓冲,0表示无缓冲,正数表示自定义缓冲行数stdin程序的标准输入句柄,NONE表示不进行重定向,继承父进程,PIPE表示创建管道stdout程序的标准输出句柄,参数意义同上stderr程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致shell为True时,表示将通过shell来执行cwd用来设置当前子进程的目录env设置环境变量,为NONE表示继承自父进程的universal_newlines将此参数设置为True,Python统一把这些换行符当作’/n’来处理。

进程通信实例 在shell=True这个参数,不写的时候默认是False,shell默认为/bin/sh。如果 args是一个字符串,则该字符串指定要通过shell执行的命令。这意味着字符串的格式必须与在shell提示符下键入时完全相同。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,任何其他项将被视为shell本身的附加参数。也就是说,Popen相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])
?

communicate()会避免由于输出参数过多造成死锁。返回的是一个tuple,(stdout,stderr)。

注:使用subprocess的时候,第一个填写程序所在位置,第二个填写程序工作目录

subprocess.Popen(r'D:\\Crisis\\game\\f4_chop.exe', cwd=r'D:\\Crisis\\game')

参考:https://www.jianshu.com/p/f1b2653b8561 https://www.jb51.net/article/133941.htm


总结:最重要的就是上面这两部分,这里提供一个简单的案例供参考:

#-*-coding:GBK -*- import threading
import time
import os
import subprocess
import configparser
?
# get config context config = configparser.ConfigParser()
config.read('config.ini', encoding='GB18030')
path1 = config.get('PATH', 'path1')
path2 = config.get('PATH', 'path2')
?
def get_process_count(imagename):
    p = os.popen('tasklist /FI "IMAGENAME eq %s"' % imagename)
    return p.read().count(imagename)
?
def timer_start():
    print("timer_start")
    t = threading.Timer(10, watch_func, ["is running..."])
    t.start()
?
def watch_func(msg):
    print("I'm watch_func")
    if get_process_count('TradeGate.exe') == 0:
        print("get_process_count")
        subprocess.Popen(path1,cwd=path2)
    timer_start()
?
if __name__ == "__main__":
?
    timer_start()
    while True:
        time.sleep(1)

相关推荐

Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)

在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...

Connect 2.0来了,还有Nuke和Maya新集成

ftrackConnect2.0现在可以下载了--重新设计的桌面应用程序,使用户能够将ftrackStudio与创意应用程序集成,发布资产等。这个新版本的发布中还有两个Nuke和Maya新集成,...

Magicgui:不会GUI编程也能轻松构建Python GUI应用

什么是MagicguiMagicgui是一个Python库,它允许开发者仅凭简单的类型注解就能快速构建图形用户界面(GUI)应用程序。这个库基于Napari项目,利用了Python的强大类型系统,使得...

Python入坑系列:桌面GUI开发之Pyside6

阅读本章之后,你可以掌握这些内容:Pyside6的SignalsandSlots、Envents的作用,如何使用?PySide6的Window、DialogsandAlerts、Widgets...

Python入坑系列-一起认识Pyside6 designer可拖拽桌面GUI

通过本文章,你可以了解一下内容:如何安装和使用Pyside6designerdesigner有哪些的特性通过designer如何转成python代码以前以为Pyside6designer需要在下载...

pyside2的基础界面(pyside2显示图片)

今天我们来学习pyside2的基础界面没有安装过pyside2的小伙伴可以看主页代码效果...

Python GUI开发:打包PySide2应用(python 打包pyc)

之前的文章我们介绍了怎么使用PySide2来开发一个简单PythonGUI应用。这次我们来将上次完成的代码打包。我们使用pyinstaller。注意,pyinstaller默认会将所有安装的pack...

使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂

PySide2是Qt框架的Python绑定,允许你使用Python创建功能强大的跨平台GUI应用程序。PySide2的基本使用方法:安装PySide2pipinstallPy...

pycharm中conda解释器无法配置(pycharm安装的解释器不能用)

之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...

Conda使用指南:从基础操作到Llama-Factory大模型微调环境搭建

Conda虚拟环境在Linux下的全面使用指南:从基础操作到Llama-Factory大模型微调环境搭建在当今的AI开发与数据分析领域,conda虚拟环境已成为Linux系统下管理项目依赖的标配工具。...

Python操作系统资源管理与监控(python调用资源管理器)

在现代计算环境中,对操作系统资源的有效管理和监控是确保应用程序性能和系统稳定性的关键。Python凭借其丰富的标准库和第三方扩展,提供了强大的工具来实现这一目标。本文将探讨Python在操作系统资源管...

本地部署开源版Manus+DeepSeek创建自己的AI智能体

1、下载安装Anaconda,设置conda环境变量,并使用conda创建python3.12虚拟环境。2、从OpenManus仓库下载代码,并安装需要的依赖。3、使用Ollama加载本地DeepSe...

一文教会你,搭建AI模型训练与微调环境,包学会的!

一、硬件要求显卡配置:需要Nvidia显卡,至少配备8G显存,且专用显存与共享显存之和需大于20G。二、环境搭建步骤1.设置文件存储路径非系统盘存储:建议将非安装版的环境文件均存放在非系统盘(如E盘...

使用scikit-learn为PyTorch 模型进行超参数网格搜索

scikit-learn是Python中最好的机器学习库,而PyTorch又为我们构建模型提供了方便的操作,能否将它们的优点整合起来呢?在本文中,我们将介绍如何使用scikit-learn中的网格搜...

如何Keras自动编码器给极端罕见事件分类

全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...