用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 True
    return False

def open_calculator():
    # 启动计算器进程
    process = subprocess.Popen('calc.exe')
    return process

def 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 subprocess

import pyautogui
import psutil

import tkinter as tk

#用计算器做演示。
import sys

from 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()



        pass

    def 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 True
            return False

        def open_calculator():
            # 启动计算器进程
            process = subprocess.Popen(text2)
            return process

        def 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()
        
        
        
       

        pass



if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库压力测试方法概述

一、前言 在前面的压力测试过程中,主要关注的是对接口以及服务器硬件性能进行压力测试,评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说,整个系统的瓶颈在于数据库。 原因很简单:Web应用中的其他因素,…

【Kafka系列 07】Kafka 如何保证消息不丢失

一、Kafka 消息不丢失的边界 一直以来,很多人对于 Kafka 丢失消息这件事情都有着自己的理解,因而也就有着自己的解决之道。在讨论具体的应对方法之前,我觉得我们首先要明确,在 Kafka 的世界里什么才算是消息丢失,或者…

IQmath库移植至ST系列单片机实战教程1

使用注意事项: 1.注意IQmath库使用的数据范围,如果使用IQ24格式,其范围不能超过-128~128; 如果输入的时候不注意其使用范围,会导致数据溢出,出现一直为0的情况。 如定义 _iq24 a 0; a _IQ24(380)其结果…

史上最细,接口自动化测试用例设计编写总结,一篇带你打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 说到自动化测试&a…

[MYSQL]当数据库被攻破如何重新恢复

前情提要:mysql数据库默认密码、默认端口没有改,也没做安全防护,导致被攻破被索要比特币。 那我们自然是不能给他们的,下面罗列我的补救方法。 密码修改相关 第一步大家自然都会想到先去修改密码: mysqladmin -u roo…

【C语言】操作符相关知识点

移位操作符 << 左移操作符 >>右移操作符 左移操作符 移位规则&#xff1a; 左边抛弃、右边补0 右移操作符 移位规则&#xff1a; 首先右移运算分两种&#xff1a; 1.逻辑移位 左边用0填充&#xff0c;右边丢弃 2.算术移位 左边用原该值的符号位填充&#xff0c;…

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器&#xff1f; es在创建倒排索引时需要对文档分词&#xff1b;在搜索时&#xff0c;需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试&#xff1a; GET /_analyze {"analyzer": "…

最简k8s部署(AWS Load Balancer Controller使用)

问题 我需要在k8s集群里面部署springboot服务&#xff0c;通过k8s ingress访问集群内部的springboot服务&#xff0c;应该怎么做&#xff1f; 这里假设已经准备好k8s集群&#xff0c;而且也准备好springboot服务的运行镜像了。这里我们将精力放在k8s服务编排上面。 一图胜千言…

Supplementary Influence Maximization Problem in Social Networks

本论文发表于 IEEE TRANSACTIONS ON COMPUTATIONAL SOCIAL SYSTEMS, VOL. 11, NO. 1, FEBRUARY 2024 Abstract 由于在病毒式营销中的重要应用&#xff0c;影响力最大化&#xff08;IM&#xff09;已成为一个经过充分研究的问题。它的目的是找到一小部分初始用户&#xff0c;以…

智能问数,让数据对话变得如此简单

——用自然语言点亮数据智慧&#xff0c;让深度分析触手可及&#xff0c;让每个人都拥有私人数据分析师。 想象一下&#xff0c;曾经的数据查询&#xff0c;意味着面对着密密麻麻的电子表格&#xff0c;手动筛选、匹配与解读&#xff0c;耗费大量的时间与精力&#xff0c;或者…

【今日面经】24/3/8 又是Java后端面经啊啊啊啊啊啊啊

目录 1.osi七层模型&#xff1f;数据链路层是干什么的&#xff1f;2.tcp三次握手过程&#xff0c;tcp报文头部的结构&#xff1f;里面都有什么&#xff1f;3.讲讲超时重传和快重传&#xff0c;怎么等待的超时重传&#xff08;Timeout Retransmission&#xff09;快速重传&#…

高清数学公式视频素材、科学公式和方程式视频素材下载

适用于科普、解说的自媒体视频剪辑素材&#xff0c;黑色背景数学、科学公式和方程式视频素材下载。 视频编码&#xff1a;H.264 | 分辨率&#xff1a;3840x2160 (4K) | 无需插件 | 文件大小&#xff1a;16.12MB 来自PR视频素材&#xff0c;下载地址&#xff1a;https://prmuban…

Redis持久化机制之RDB内存快照

1、引言 我们经常在数据库层上加一层缓存&#xff08;如Redis&#xff09;&#xff0c;来保证数据的访问效率。 这样性能确实也有了大幅度的提升&#xff0c;因为从内存中取数远比从磁盘中快的多&#xff0c;但是本身Redis也是一层服务&#xff0c;也存在宕机、故障的可能性。…

蓝色经典免费wordpress模板主题

蓝色经典配色的免费wordpress建站主题&#xff0c;万能的wordpress建站主题。 https://www.wpniu.com/themes/24.html

【好书推荐-第十期】《AI绘画教程:Midjourney使用方法与技巧从入门到精通》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计&#xff0c;O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置&#xff0c;不需要过多的代码编写&#xff0c;业务人员可以直接进行修改操作。 在流程表单设计界面&#xff0c;可以在左边的工具栏找到Ele…

Take-home questions——L3

Match the spatial domain image to the Fourier magnitude image 1—D 2—B 3—A 4—E 5—C

STM32F4串口波特率相关时钟

在main中调用的 Stm32_Clock_Init(336, 8, 2, 7); /* 设置时钟,168Mhz *///8*336/8/2168 时钟源,PLL寄存器配置函数: HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) 系统时钟,总线寄存器配置,及HCLK时钟计算函数: HAL_StatusTyp…

用于回归的概率模型

机器学习中的回归方法&#xff1a; 机器学习中的概率模型 机器学习&#xff5c;总结了11种非线性回归模型&#xff08;理论代码可视化&#xff09; 高斯过程回归&#xff1a; Gaussian Processes for Machine Learning GPML——Datasets and Code Gaussian Processes 学…

力扣-数组题

1. 两数之和 找出map中是否有target-nums[i]&#xff0c; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i 0 ;i < nums.size(); i){if(hash.find(target - nums[i]) ! hash…
最新文章