70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
import os, subprocess, time, datetime, json
|
|
from multiprocessing import Value
|
|
from threading import Thread
|
|
from pathlib import Path
|
|
|
|
from accservermanager import settings
|
|
|
|
try: import resource
|
|
except: resource = None
|
|
|
|
|
|
class Executor(Thread):
|
|
"""
|
|
Thread for running the server process
|
|
"""
|
|
def __init__(self, instanceDir):
|
|
super().__init__()
|
|
|
|
# add all configuration values to the object
|
|
for key, val in json.load(open(os.path.join(instanceDir, 'cfg', 'configuration.json'), 'r', encoding='utf-16')).items():
|
|
setattr(self, key, val)
|
|
for key, val in json.load(open(os.path.join(instanceDir, 'cfg', 'settings.json'), 'r', encoding='utf-16')).items():
|
|
setattr(self, key, val)
|
|
|
|
# find the name of the config file, just needed to display it in the instances list
|
|
self.config = Path(os.path.join(instanceDir, 'cfg', 'event.json')).resolve().name
|
|
|
|
self.p = None
|
|
self.stdout = None
|
|
self.stderr = None
|
|
self.serverlog = None
|
|
self.retval = None
|
|
self.instanceDir = instanceDir
|
|
|
|
self.stop = Value('i', 0)
|
|
|
|
def run(self):
|
|
preexec_fn = None
|
|
exec = settings.ACCEXEC
|
|
if resource:
|
|
# in linux, limit ram to 1GB soft, 2GB hard
|
|
preexec_fn = lambda: resource.setrlimit(resource.RLIMIT_DATA, (2**30, 2**31))
|
|
else:
|
|
# if 'resource' is not available, assume windows which needs to full path to the exec
|
|
exec = os.path.join(self.instanceDir, *settings.ACCEXEC)
|
|
|
|
# fire up the server, store stderr to the log/ dir
|
|
_tm = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
|
|
self.stdout = os.path.join(self.instanceDir, 'log', 'stdout-%s.log'%(_tm))
|
|
self.stderr = os.path.join(self.instanceDir, 'log', 'stderr-%s.log'%(_tm))
|
|
self.serverlog = os.path.join(self.instanceDir, 'log', 'server.log')
|
|
self.p = subprocess.Popen(exec,
|
|
# set working dir
|
|
cwd=self.instanceDir,
|
|
# limit ram to 1GB soft, 2GB hard
|
|
preexec_fn=preexec_fn,
|
|
# shell=True,
|
|
universal_newlines=True,
|
|
stdout=open(self.stdout,'w'),
|
|
stderr=open(self.stderr,'w'))
|
|
|
|
# wait for the stop signal or for the server to die on its own
|
|
self.retval = None
|
|
while self.retval is None:
|
|
if self.stop.value == 1: self.p.kill()
|
|
time.sleep(1)
|
|
self.retval = self.p.poll()
|
|
|
|
print("Retval:",self.retval)
|