bazarr/bazarr.py
Smaarn 7e304001b6 Rework on child process management.
When receiving the SIGTERM signal, swallow it and terminate latest created child process
Catch ChildProcessError (occurs when child process is terminated by the current python script on mac os x)
2020-05-24 14:58:41 +02:00

106 lines
2.8 KiB
Python

# coding=utf-8
import os
import platform
import signal
import subprocess
import sys
import time
import atexit
from bazarr.get_args import args
def check_python_version():
python_version = platform.python_version_tuple()
minimum_py3_tuple = (3, 7, 0)
minimum_py3_str = ".".join(str(i) for i in minimum_py3_tuple)
if int(python_version[0]) < minimum_py3_tuple[0]:
print("Python " + minimum_py3_str + " or greater required. "
"Current version is " + platform.python_version() + ". Please upgrade Python.")
sys.exit(1)
elif (int(python_version[0]) == minimum_py3_tuple[0] and int(python_version[1]) < minimum_py3_tuple[1]) or \
(int(python_version[0]) != minimum_py3_tuple[0]):
print("Python " + minimum_py3_str + " or greater required. "
"Current version is " + platform.python_version() + ". Please upgrade Python.")
sys.exit(1)
check_python_version()
dir_name = os.path.dirname(__file__)
def end_child_process(ep):
try:
ep.kill()
except:
pass
def terminate_child_process(ep):
try:
ep.terminate()
except:
pass
def start_bazarr():
script = [sys.executable, "-u", os.path.normcase(os.path.join(dir_name, 'bazarr', 'main.py'))] + sys.argv[1:]
ep = subprocess.Popen(script, stdout=None, stderr=None, stdin=subprocess.DEVNULL)
atexit.register(end_child_process, ep=ep)
signal.signal(signal.SIGTERM, lambda signal_no, frame: terminate_child_process(ep))
def check_status():
if os.path.exists(stopfile):
try:
os.remove(stopfile)
except Exception:
print('Unable to delete stop file.')
finally:
print('Bazarr exited.')
sys.exit(0)
if os.path.exists(restartfile):
try:
os.remove(restartfile)
except Exception:
print('Unable to delete restart file.')
else:
print("Bazarr is restarting...")
start_bazarr()
if __name__ == '__main__':
restartfile = os.path.join(args.config_dir, 'bazarr.restart')
stopfile = os.path.join(args.config_dir, 'bazarr.stop')
# Cleanup leftover files
try:
os.remove(restartfile)
except FileNotFoundError:
pass
try:
os.remove(stopfile)
except FileNotFoundError:
pass
# Initial start of main bazarr process
print("Bazarr starting...")
start_bazarr()
# Keep the script running forever until stop is requested through term or keyboard interrupt
while True:
check_status()
try:
if sys.platform.startswith('win'):
time.sleep(5)
else:
os.wait()
time.sleep(1)
except (KeyboardInterrupt, SystemExit, ChildProcessError):
print('Bazarr exited.')
sys.exit(0)