ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

windows python 守护进程

2022-09-16 14:01:44  阅读:404  来源: 互联网

标签:__ name windows self pid python each print 守护


# 根据pid进行守护,先保存一个pid
import time
import os


class Demo:
    
    def __init__(self):
        pass
    
    def setpid(self):  # 记录进程号PID
        fo = open("pid.txt", "w")
        pid = str(os.getpid())
        print("pid", pid)
        fo.write(pid)
        fo.flush()
        fo.close()
        return pid
    
    def execute(self):
        pid = self.setpid()
        print("启动程序,进程号:" + str(pid))
        i = 1
        while True:
            print("pid = " + pid + " ---------- run " + str(i) + " s ")
            time.sleep(1)
            i += 1
            if i > 10:
                break
        print("程序关闭...")


if __name__ == '__main__':
    demo = Demo()
    demo.execute()
#读取pid再进行判断
import psutil
import os


class Monitor:
    pidNotHandle = []
    
    def __init__(self):
        self.pidNotHandle = list(psutil.process_iter())  # 获取当前计算机的pid
    
    def getpid(self):  # 获取进程号PID
        fo = open("pid_.txt", "r")
        result = fo.read()
        fo.flush()
        fo.close()
        return result
    
    def execute(self):
        pid = []
        for each in self.pidNotHandle:
            a = str(each)  # each 是 class类型,可用type(each)查看类型
            # a 数据样式为:psutil.Process(pid=0, name='System Idle Process')
            pid.append(a[15:-1])  # 只取括号内部分;pid=0, name='System Idle Process'
        
        status = 0  # 被监控程序进程存在状态,0不存在,1存在
        for each in pid:
            nameposition = each.find("name")  # 获取name的位置;name='System Idle Process'
            namevalue = each[nameposition + 6:-1]  # 获取name值;System Idle Process
            pidposition = each.find("pid")
            pidvalue = each[pidposition + 4:nameposition - 2]
            print("name=" + namevalue + ", pid=" + pidvalue + "\n")
            
            if pidvalue == self.getpid():
                status = 1
                print("发现进程==============name=" + namevalue + ", pid=" + pidvalue + "\n")
                break
        
        if status == 0:  # 进程不存在,重新启动程序
            cmd = r"python test1.py"
            print(cmd)
            res = os.popen(cmd)
            print(res)
            print("重启程序.............")
        
        print("ending.............")
        return 0


if __name__ == '__main__':
    Monitor().execute()
# 如果是打包成exe的程序
import time
import sys
import psutil
import os


class MonitorServer:
    pidNotHandle = []
    servername = "jira_Scheduler.exe"

    def __init__(self):
        self.pidNotHandle = list(psutil.process_iter())

    def execute(self):
        pid = []
        for each in self.pidNotHandle:
            a = str(each)
            pid.append(a[15:-1])

        status = 0
        for each in pid:
            nameposition = each.find("name")
            namevalue = each[nameposition + 6:-1].split(',')[0].replace("'","")
            pidposition = each.find("pid")
            pidvalue = each[pidposition + 4:nameposition - 2]
            print("name=" + namevalue + ", pid=" + pidvalue + "\n")

            if namevalue == self.servername:
                status = 1
                print("发现进程==============name=" + namevalue + ", pid=" + pidvalue + "\n")
                break

        if status == 0:
       #如果需要重新调用exe程序,此处为在同一个路径下,且将此程序也打包为exe程序时,需要切换真实的工作路径
       #如果此程序不打包,拼接此时的运行路径即可
print(os.path.join(os.path.dirname(os.path.realpath(sys.executable)), self.servername)) cmd = os.path.join(os.path.dirname(os.path.realpath(sys.executable)), self.servername) print(cmd) os.popen(cmd) time.sleep(5) print("重启程序.............") print("ending.............") return 0 if __name__ == '__main__': MonitorServer().execute()

 

标签:__,name,windows,self,pid,python,each,print,守护
来源: https://www.cnblogs.com/meipu/p/16699635.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有