Make sure only one instance is running at a time

This commit is contained in:
Brett Williams
2024-08-24 01:35:50 -05:00
parent dea7574888
commit e35a5a689c
2 changed files with 23 additions and 9 deletions

View File

@@ -26,7 +26,7 @@ a = Analysis(
runtime_hooks=[], runtime_hooks=[],
excludes=[], excludes=[],
noarchive=False, noarchive=False,
optimize=0, optimize=1, # fyi: optim level 2 breaks on windows
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
@@ -40,7 +40,7 @@ if platform.system() == 'Darwin': # macOS
name=APP_NAME, name=APP_NAME,
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=True,
upx=True, upx=True,
console=False, console=False,
disable_windowed_traceback=False, disable_windowed_traceback=False,
@@ -87,7 +87,7 @@ elif platform.system() == 'Windows':
name=APP_NAME, name=APP_NAME,
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=True,
upx=True, upx=True,
console=False, console=False,
disable_windowed_traceback=False, disable_windowed_traceback=False,
@@ -108,7 +108,7 @@ else: # linux
name=APP_NAME, name=APP_NAME,
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=True,
upx=True, upx=True,
console=False, console=False,
disable_windowed_traceback=False, disable_windowed_traceback=False,

View File

@@ -15,6 +15,7 @@ from src.render_queue import RenderQueue
from src.utilities.config import Config from src.utilities.config import Config
from src.utilities.misc_helper import system_safe_path, current_system_cpu, current_system_os, current_system_os_version from src.utilities.misc_helper import system_safe_path, current_system_cpu, current_system_os, current_system_os_version
from src.utilities.zeroconf_server import ZeroconfServer from src.utilities.zeroconf_server import ZeroconfServer
from version import APP_NAME
logger = logging.getLogger() logger = logging.getLogger()
@@ -29,16 +30,29 @@ def run(server_only=False) -> int:
int: The exit status code. int: The exit status code.
""" """
def existing_process(process_name):
import psutil
for proc in psutil.process_iter(['pid', 'name']):
if proc.info['name'].lower() == process_name.lower() and proc.info['pid'] != os.getpid():
return proc
return None
# setup logging # setup logging
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S', logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S',
level=Config.server_log_level.upper()) level=Config.server_log_level.upper())
logging.getLogger("requests").setLevel(logging.WARNING) # suppress noisy requests/urllib3 logging logging.getLogger("requests").setLevel(logging.WARNING) # suppress noisy requests/urllib3 logging
logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING)
# check for existing instance
existing_proc = existing_process(APP_NAME)
if existing_proc:
logger.fatal(f"Another instance of {APP_NAME} is already running (pid: {existing_proc.pid})")
sys.exit(1)
# Setup logging for console ui # Setup logging for console ui
buffer_handler = __setup_buffer_handler() if not server_only else None buffer_handler = __setup_buffer_handler() if not server_only else None
logger.info(f"Starting Zordon Render Server") logger.info(f"Starting {APP_NAME} Render Server")
return_code = 0 return_code = 0
try: try:
# Load Config YAML # Load Config YAML
@@ -77,13 +91,13 @@ def run(server_only=False) -> int:
api_server.start() api_server.start()
# start zeroconf server # start zeroconf server
ZeroconfServer.configure("_zordon._tcp.local.", local_hostname, Config.port_number) ZeroconfServer.configure(f"_{APP_NAME.lower()}._tcp.local.", local_hostname, Config.port_number)
ZeroconfServer.properties = {'system_cpu': current_system_cpu(), ZeroconfServer.properties = {'system_cpu': current_system_cpu(),
'system_cpu_cores': multiprocessing.cpu_count(), 'system_cpu_cores': multiprocessing.cpu_count(),
'system_os': current_system_os(), 'system_os': current_system_os(),
'system_os_version': current_system_os_version()} 'system_os_version': current_system_os_version()}
ZeroconfServer.start() ZeroconfServer.start()
logger.info(f"Zordon Render Server started - Hostname: {local_hostname}") logger.info(f"{APP_NAME} Render Server started - Hostname: {local_hostname}")
RenderQueue.start() # Start evaluating the render queue RenderQueue.start() # Start evaluating the render queue
# start in gui or server only (cli) mode # start in gui or server only (cli) mode
@@ -100,13 +114,13 @@ def run(server_only=False) -> int:
return_code = 1 return_code = 1
finally: finally:
# shut down gracefully # shut down gracefully
logger.info(f"Zordon Render Server is preparing to shut down") logger.info(f"{APP_NAME} Render Server is preparing to shut down")
try: try:
RenderQueue.prepare_for_shutdown() RenderQueue.prepare_for_shutdown()
except Exception as e: except Exception as e:
logger.exception(f"Exception during prepare for shutdown: {e}") logger.exception(f"Exception during prepare for shutdown: {e}")
ZeroconfServer.stop() ZeroconfServer.stop()
logger.info(f"Zordon Render Server has shut down") logger.info(f"{APP_NAME} Render Server has shut down")
return sys.exit(return_code) return sys.exit(return_code)