用python写一个自动进程守护,带UI

功能是指定程序关闭后自动重启,并点击1作为启动
原来的想法是群成员说的某软件打包后,软件进程被杀后,界面白屏。所以写了个计算器重启demo进行进程守护
在这里插入图片描述

import subprocess
import time
import pyautogui
import psutil
#用计算器做演示。
def is_calculator_running():# 查找所有正在运行的计算器进程for proc in psutil.process_iter(['pid', 'name']):# 检查进程名是否为 'Calculator.exe'if proc.info['name'] == 'Calculator.exe':return Truereturn Falsedef open_calculator():# 启动计算器进程process = subprocess.Popen('calc.exe')return processdef click_button_1():# 等待计算器打开并加载time.sleep(2)  # 根据需要调整等待时间# 模拟点击"1"按钮,这里直接发送"1"键# 注意:确保计算器是当前激活的窗口pyautogui.press('1')def main():while True:if not is_calculator_running():print("Calculator is not running. Starting...")process = open_calculator()click_button_1()time.sleep(1)  # 每秒检查一次if __name__ == '__main__':main()

带UI的

,代码没有优化,能用就行
在这里插入图片描述

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import sys
import time
import threading
import subprocessimport pyautogui
import psutilimport tkinter as tk#用计算器做演示。
import sysfrom tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkinter.messagebox import *
#from tkinter import filedialog  #.askopenfilename()
#from tkinter import simpledialog  #.askstring()class Application_ui(Frame):#这个类仅实现界面生成功能,具体事件处理代码在子类Application中。def __init__(self, master=None):super().__init__(master)# To center the window on the screen.ws = self.master.winfo_screenwidth()hs = self.master.winfo_screenheight()x = (ws / 2) - (333 / 2)y = (hs / 2) - (271 / 2)self.master.geometry('%dx%d+%d+%d' % (333,271,x,y))self.master.title('Form1')self.createWidgets()def createWidgets(self):self.top = self.winfo_toplevel()self.style = Style()self.Command2Var = StringVar(value='强制停止本程序')self.style.configure('TCommand2.TButton', font=('宋体',9))self.Command2 = Button(self.top, text='强制停止本程序', textvariable=self.Command2Var, command=self.Command2_Cmd, style='TCommand2.TButton')self.Command2.setText = lambda x: self.Command2Var.set(x)self.Command2.text = lambda : self.Command2Var.get()self.Command2.place(relx=0.505, rely=0.472, relwidth=0.363, relheight=0.151)self.Command1Var = StringVar(value='启动监控')self.style.configure('TCommand1.TButton', font=('宋体',9))self.Command1 = Button(self.top, text='启动监控', textvariable=self.Command1Var, command=self.Command1_Cmd, style='TCommand1.TButton')self.Command1.setText = lambda x: self.Command1Var.set(x)self.Command1.text = lambda : self.Command1Var.get()self.Command1.place(relx=0.12, rely=0.472, relwidth=0.267, relheight=0.151)self.Text2Var = StringVar(value='calc.exe')self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=('宋体',9))self.Text2.setText = lambda x: self.Text2Var.set(x)self.Text2.text = lambda : self.Text2Var.get()self.Text2.place(relx=0.505, rely=0.295, relwidth=0.459, relheight=0.122)self.Text1Var = StringVar(value='Calculator.exe')self.Text1 = Entry(self.top, textvariable=self.Text1Var, font=('宋体',9))self.Text1.setText = lambda x: self.Text1Var.set(x)self.Text1.text = lambda : self.Text1Var.get()self.Text1.place(relx=0.505, rely=0.089, relwidth=0.459, relheight=0.151)self.Label5Var = StringVar(value='比如D:\D1\\ajide.exe')self.style.configure('TLabel5.TLabel', anchor='w', font=('宋体',9))self.Label5 = Label(self.top, text='比如D:\D1\\ajide.exe', textvariable=self.Label5Var, style='TLabel5.TLabel')self.Label5.setText = lambda x: self.Label5Var.set(x)self.Label5.text = lambda : self.Label5Var.get()self.Label5.place(relx=0.048, rely=0.915, relwidth=0.7, relheight=0.092)self.Label4Var = StringVar(value='名字为Calculator.exe,启动程序是启动路径,')self.style.configure('TLabel4.TLabel', anchor='w', font=('宋体',9))self.Label4 = Label(self.top, text='名字为Calculator.exe,启动程序是启动路径,', textvariable=self.Label4Var, style='TLabel4.TLabel')self.Label4.setText = lambda x: self.Label4Var.set(x)self.Label4.text = lambda : self.Label4Var.get()self.Label4.place(relx=0.048, rely=0.797, relwidth=0.988, relheight=0.092)self.Label3Var = StringVar(value='保护对象是在任务管理器的名字,如计算器,')self.style.configure('TLabel3.TLabel', anchor='w', font=('宋体',9))self.Label3 = Label(self.top, text='保护对象是在任务管理器的名字,如计算器,', textvariable=self.Label3Var, style='TLabel3.TLabel')self.Label3.setText = lambda x: self.Label3Var.set(x)self.Label3.text = lambda : self.Label3Var.get()self.Label3.place(relx=0.048, rely=0.679, relwidth=0.844, relheight=0.151)self.Label2Var = StringVar(value='如监控到关闭启动程序')self.style.configure('TLabel2.TLabel', anchor='w', font=('宋体',9))self.Label2 = Label(self.top, text='如监控到关闭启动程序', textvariable=self.Label2Var, style='TLabel2.TLabel')self.Label2.setText = lambda x: self.Label2Var.set(x)self.Label2.text = lambda : self.Label2Var.get()self.Label2.place(relx=0.048, rely=0.266, relwidth=0.363, relheight=0.122)self.Label1Var = StringVar(value='请输入你要保护的对象')self.style.configure('TLabel1.TLabel', anchor='w', font=('宋体',9))self.Label1 = Label(self.top, text='请输入你要保护的对象', textvariable=self.Label1Var, style='TLabel1.TLabel')self.Label1.setText = lambda x: self.Label1Var.set(x)self.Label1.text = lambda : self.Label1Var.get()self.Label1.place(relx=0.048, rely=0.118, relwidth=0.411, relheight=0.092)class Application(Application_ui):#这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。def __init__(self, master=None):super().__init__(master)def Command2_Cmd(self, event=None):#TODO, Please finish the function here!input_value = self.Text2.text() print(input_value)time.sleep(100)# 执行一些任务...# 关闭可执行文件sys.exit()passdef Command1_Cmd(self, event=None):#TODO, Please finish the function here!text1 = self.Text1.text()text2 = self.Text2.text()def is_calculator_running():# 查找所有正在运行的计算器进程for proc in psutil.process_iter(['pid', 'name']):# 检查进程名是否为 'Calculator.exe'if proc.info['name'] == text1:return Truereturn Falsedef open_calculator():# 启动计算器进程process = subprocess.Popen(text2)return processdef click_button_1():# 等待计算器打开并加载time.sleep(2)  # 根据需要调整等待时间# 模拟点击"1"按钮,这里直接发送"1"键# 注意:确保计算器是当前激活的窗口pyautogui.press('1')def main1():while True:if not is_calculator_running():print("Calculator is not running. Starting...")process = open_calculator()click_button_1()time.sleep(1)  # 每秒检查一次def long_running_task():# 模拟一个耗时的任务main1()# 创建并启动线程thread = threading.Thread(target=long_running_task)thread.start()passif __name__ == "__main__":top = Tk()Application(top).mainloop()

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

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

相关文章

WiFi模块助力敏捷办公:现代办公室的关键角色

随着信息技术的飞速发展,现代办公室正经历着一场数字化和智能化的变革。在这一变革过程中,WiFi模块作为无线通信技术的核心组成部分,扮演着关键的角色,为敏捷办公提供了强大的支持。本文将深入探讨WiFi模块在现代办公室中的关键角…

Spring Boot工作原理

Spring Boot Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spr…

安康杯安全知识竞赛上的讲话稿

各位领导、同志们: 经过近半个月时间的准备,南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕,经过紧张激烈的角逐, 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

使用插件vue-seamless-scroll 完成内容持续动态

1、安装插件 npm install vue-seamless-scroll --save 2、项目中引入 //单独引入import vueSeamlessScroll from vue-seamless-scrollexport default {components: { vueSeamlessScroll},}//或者在main.js引入import scroll from vue-seamless-scrollVue.use(scroll)3、页面使…

SRS服务器ffmpeg 推流rtmp超时中断

ffmpeg错误显示 failed to update header with correct duration failed to update header with correct filesize. Error writing trailer of rtmp://----- broken pipe SRS日志错误显示 serve error code2056 kickoffforidle : service cycle : rtmp stream service: timeou…

基于Pytorch搭建分布式训练环境

Pytorch系列 文章目录 Pytorch系列前言一、DDP是什么二、DPP原理terms、nodes 和 ranks等相关术语解读DDP 的局限性为什么要选择 DDP 而不是 DP代码演示1. 在一个单 GPU 的 Node 上进行训练(baseline)2. 在一个多 GPU 的 Node 上进行训练临门一脚&#x…

【深度学习笔记】稠密连接网络(DenseNet)

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.12 稠密连接网络(DenseNet) ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

5个实用的PyCharm插件

大家好,本文向大家推荐五个顶级插件,帮助开发人员提升PyCharm工作流程,将生产力飞升到新高度。 1.CodiumAI 安装链接:https://plugins.jetbrains.com/plugin/21206-codiumate--code-test-and-review-with-confidence--by-codium…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时,使用windows上内置搜索会很慢,这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎,它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索,"Everything&…

容器:Docker部署

docker 是容器,可以将项目的环境(比如 java、nginx)和项目的代码一起打包成镜像,所有同学都能下载镜像,更容易分发和移植。 再启动项目时,不需要敲一大堆命令,而是直接下载镜像、启动镜像就可以…

echarts x轴名称过长tip显示全称

xAxis的axisLabel的内容如下: axisLabel: { rotate: -45, color: document.body.className.indexOf(custom-f4c46d) > -1 ? #fff : #343434, // 显示省略号操作(第一步) formatter: function (value) { var val if (value.length >…

NTP协议介绍

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时…

C while 循环

只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。 语法 C 语言中 while 循环的语法: while(condition) {statement(s); }在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。 co…

IOS开发0基础入门UIkit-1cocoapod安装、更新和使用 , 安装中出现的错误及解决方案 M1或者M2安装cocoapods

cocoapod是ios开发时常用的包管理工具 1.M1或者是M2系统安装cocoapods先操作一下两个设置 1、打开访达->应用->实用工具->终端->右键点击终端->显示简介->勾选使用 Rosetta 打开,关闭终端,重新打开。 2、打开访达->应用->Xcod…

ApiPost设置预执行脚本获取token,并设置给请求头

ApiPost设置预执行脚本获取token,并设置给请求头 预执行脚本 这个地方获取字段为 {"msg": "操作成功","code": 200,"token": "eyJhbGciOixMiJ9.123-NQQPPKGr4Yxa1_H_JIrUXJQ" }修改head 里面参数

OpenAI劲敌吹新风! Claude 3正式发布,Claude3使用指南

Claude 3是什么? 是Anthropic 实验室近期推出的 Claude 3 大规模语言模型(Large Language Model,LLM)系列,代表了人工智能技术的一个显著飞跃。 该系列包括三个不同定位的子模型:Claude 3 Haiku、Claude 3…

BUUCTF-Misc3

LSB1 1.打开附件 得到一张图片,像是某个大学的校徽 2.Stegsolve工具 根据标题LSB,可能是LSB隐写 放到Stegsolve中,点Analyse在点Data Extract 数据提取 因为是LSB隐写,发现含以.png结尾的图片 3.保存图片 4.得到flag 扫描二维…

一招教你优化TCP提高大文件传输效率

在当今企业的数据传输实践中,传统的传输控制协议(TCP)在处理大型文件传输时,其固有的可靠性和复杂性有时会导致效率不足。为了提升大文件传输的效率,对TCP进行优化成为了一个关键任务。 TCP传输的可靠性是其核心优势&a…

UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合 1.Blend混合 // 正常,透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…

聊聊 HTTP 性能优化

哈喽大家好,我是咸鱼。 作为用户的我们在 “上网冲浪” 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢、响应延迟的情况。 而 HTTP 协议作为互联网世界的基础,从网…