厉害了,监控程序

2024-04-21 16:58
文章标签 程序 监控 厉害

本文主要是介绍厉害了,监控程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

厉害了,监控程序


在程序员的生活中,往往会见识到很多高大上的程序;这两天做项目,需要做一个监控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('Tt.exe') == 0:print("get_process_count")subprocess.Popen(path1,cwd=path2)timer_start()if __name__ == "__main__":timer_start()while True:time.sleep(1)

想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发

这篇关于厉害了,监控程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923585

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

程序人生--拔丝地瓜

一个会享受生活的人,难免会执迷于探索“三餐茶饭,四季衣裳”的朴素涵义。如今在这繁杂喧闹、竞争激烈的社会环境里,如何才能从周而复始的生活中挖掘出一点儿期待!这是一个仁者见仁智者见智的开放性话题。对于大部分的人来说,看电影、运动、旅游、美食、加班....是假日的备选安排。 春节临走之前,再次尝试“拔丝地瓜”,为何要强调“再次”二字?因为这道甜菜我已经尝试过很多次,失败与成功都经历过。十几年的烧饭经历

今天又有了别的收获。青云怎么这么厉害呢- -。。感觉无论付出多么大的努力,和他差不多就行~~

1.第一个收获就是一个宏这个宏第一个参数是函数的类型,第二个是名字,第三个其实就是setRow(),getRow(),两个方法,为的就是让我们得到对象。嘿嘿,收获不小~~ 2.比如我们定义了一个宏#define WC (6) 我们调用一个方法,suShi->m_imgIndex=rand()%WC  ;表示取0-WC-1的整数值。。 3.为了更好的适配各种环境在applicatio

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网(IoT)技术的发展,远程监控系统在各个领域的应用越来越广泛。LoRaWAN(Long Range Wide Area Network)作为一种低功耗广域网通信协议,因其长距离传输、低功耗和高可靠性等特点,成为实现远程监控的理想选择。本文将详细介绍LoRaWAN的基本原理、应用场景,并通过一个具体的项目展示如何使用LoRaWAN实现远程监控系统。希望通过图文并茂的讲解,帮助读

2_为MFC程序添加菜单

在MFC中添加菜单栏 1,双击资源文件,显示资源视图,点击Menu插入Menu菜单,编辑菜单的ID,自己取名字。 2,点击“请在此处键入”添加菜单选项,输入&E,E的下面就会产生下划线;在产生的弹出菜单中继续编辑,并且可以添加事件处理函数; 在弹出菜单的任意位置,鼠标右键,弹出的菜单中选择“插入分隔符”,即可产生分隔符 3,在你设计的Dialog窗口的属性栏,选择Menu后面的

在Ubuntu 14.04上安装和配置SNMP守护程序和客户端的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 作为系统管理员的重要工作之一是收集关于服务器和基础设施的准确信息。有许多工具和选项可用于收集和处理这种类型的信息。其中许多工具都是建立在一种叫做 SNMP 的技术之上。 SNMP 代表简单网络管理协议。它是服务器可以共享关于其当前状态的信息的一种方式,也是管理员可以修改预定义值的通道。虽