import psutil
import os
from shutil import copytree
import time
import re
class Operate_Pids():
filename = "runservers.ini"
command = 'taskkill /F /PID {}'
basepath = "D:\\example\\test\\base_ver"
dstpath = "D:\\example\\test\\{}"
cfgfile = "D:\\example\\test\\{}\\cfg\\example.ini"
exe_path = "D:\\example\\test\\{}\\notepad.exe"
def __init__(self,pidname='notepad.exe'):
self.pidname = pidname
def getPid(self):
pids = psutil.pids()
pidspath={}
for pid in pids:
try:
p = psutil.Process(pid)
serverid = self.getPidId(p.exe())
if self.pidname == p.name() and serverid:
pidspath[pid]=serverid
except Exception as e:
pass
return pidspath
def getPidId(self,pidpath):
return pidpath.split('\\')[-2] if os.path.exists(pidpath) else False
def pidTemplate(self,serverid):
return self.dstpath.format(serverid)
def killPid(self,pids):
if len(pids) > 0:
for pid in pids:
os.system(self.command.format(pid))
def getServerId(self):
data = self.getDataFromFile()
if data:
return set(filter(lambda x:x.strip(),data.split("\n")))
else:
return set()
def getDataFromFile(self):
if os.path.exists(self.filename):
try:
with open(self.filename,'r') as f:
return f.read().strip('\n')
except Exception as e:
print(e)
return False
else:
return False
def cpBaseFile(self,dst):
try:
copytree(self.basepath,dst)
except Exception as e:
print(e)
pass
def mkdirs(self,dirpath):
dt = time.strftime(" %Y-%m-%d %H-%M-%S",time.localtime())
if os.path.exists(dirpath):
try:
os.rename(dirpath,dirpath+dt)
except Exception as e:
print(e)
pass
def createDir(self,servers):
for serid in servers:
path = self.pidTemplate(serid)
print(path)
self.mkdirs(path)
self.cpBaseFile(path)
self.changeGameIni(serid)
self.run(serid)
def run(self,serid):
exe_path = self.exe_path.format(serid)
os.startfile(exe_path)
def changeGameIni(self,serid):
path = self.cfgfile.format(serid)
self.writeIni(self.defineRe(self.readIni(path),serid),path)
def writeIni(self,content,path):
try:
with open(path,'w') as f:
f.write(content)
f.close()
except Exception as e:
print(e)
def defineRe(self,txt,serid):
try:
txt = re.sub(r'port=2\d+','port=2'+str(serid),txt)
txt = re.sub(r'groupid=\d+','groupid='+str(serid),txt)
except Exception as e:
print(e)
else:
return txt
def readIni(self,path):
try:
with open(path,'r') as f:
txt = f.read()
f.close()
except Exception as e:
print(e)
else:
return txt
def getdiffeId(self,src,dst):
return src - dst
def getPidBySerId(self,pids,sers):
waitpids = list()
for k,v in pids.items():
for ser in sers:
if ser == v:
waitpids.append(k)
return waitpids
def main(self):
pids = self.getPid()
self.createDir(self.getdiffeId(self.getServerId(),set(pids.values())))
waitkillserid = self.getdiffeId(set(pids.values()),self.getServerId())
waitkillpid = self.getPidBySerId(pids,waitkillserid)
self.killPid(waitkillpid)
pids = Operate_Pids()
pids.main()
strs = input("请输入q退出:")
while True:
if strs.lower() == "q":
break
strs = input("请输入q退出:")
复制代码
runserver.ini配置
1070
1071
1072
1073
1074
复制代码