3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-24 03:29:28 +01:00

launcher: daemonize and write PID file only after reading control options (-s/-R/-r)

(cherry picked from commit b9a66244f0)
This commit is contained in:
James Lu 2018-03-30 23:23:10 -07:00
parent 9d21a5269f
commit 7dec2d15db

View File

@ -23,37 +23,6 @@ def _main():
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc import classes, utils, coremods, selectdriver from pylinkirc import classes, utils, coremods, selectdriver
world.daemon = args.daemonize
if args.daemonize:
if args.no_pid:
print('ERROR: Combining --no-pid and --daemonize is not supported.')
sys.exit(1)
elif os.name != 'posix':
print('ERROR: Daemonization is not supported outside POSIX systems.')
sys.exit(1)
else:
log.info('Forking into the background.')
log.removeHandler(world.console_handler)
# Adapted from https://stackoverflow.com/questions/5975124/
if os.fork():
# Fork and exit the parent process.
os._exit(0)
os.setsid() # Decouple from our lovely terminal
if os.fork():
# Fork again to prevent starting zombie apocalypses.
os._exit(0)
else:
# For foreground sessions, set the terminal window title.
# See https://bbs.archlinux.org/viewtopic.php?id=85567 &
# https://stackoverflow.com/questions/7387276/
if os.name == 'nt':
import ctypes
ctypes.windll.kernel32.SetConsoleTitleW("PyLink %s" % __version__)
elif os.name == 'posix':
sys.stdout.write("\x1b]2;PyLink %s\x07" % __version__)
# Write and check for an existing PID file unless specifically told not to. # Write and check for an existing PID file unless specifically told not to.
if not args.no_pid: if not args.no_pid:
pidfile = '%s.pid' % conf.confname pidfile = '%s.pid' % conf.confname
@ -103,6 +72,7 @@ def _main():
log.error("Alternatively, you can install psutil for Python 3 (pip3 install psutil), " log.error("Alternatively, you can install psutil for Python 3 (pip3 install psutil), "
"which will allow this launcher to detect stale PID files and ignore them.") "which will allow this launcher to detect stale PID files and ignore them.")
sys.exit(1) sys.exit(1)
elif args.stop or args.restart or args.rehash: # XXX: also repetitive elif args.stop or args.restart or args.rehash: # XXX: also repetitive
# --stop and --restart should take care of stale PIDs. # --stop and --restart should take care of stale PIDs.
if pid: if pid:
@ -112,12 +82,45 @@ def _main():
log.error('Cannot stop/rehash PyLink: PID file %r does not exist.', pidfile) log.error('Cannot stop/rehash PyLink: PID file %r does not exist.', pidfile)
sys.exit(1) sys.exit(1)
with open(pidfile, 'w') as f:
f.write(str(os.getpid()))
world._should_remove_pid = True world._should_remove_pid = True
log.info('PyLink %s starting...', __version__) log.info('PyLink %s starting...', __version__)
world.daemon = args.daemonize
if args.daemonize:
if args.no_pid:
print('ERROR: Combining --no-pid and --daemonize is not supported.')
sys.exit(1)
elif os.name != 'posix':
print('ERROR: Daemonization is not supported outside POSIX systems.')
sys.exit(1)
else:
log.info('Forking into the background.')
log.removeHandler(world.console_handler)
# Adapted from https://stackoverflow.com/questions/5975124/
if os.fork():
# Fork and exit the parent process.
os._exit(0)
os.setsid() # Decouple from our lovely terminal
if os.fork():
# Fork again to prevent starting zombie apocalypses.
os._exit(0)
else:
# For foreground sessions, set the terminal window title.
# See https://bbs.archlinux.org/viewtopic.php?id=85567 &
# https://stackoverflow.com/questions/7387276/
if os.name == 'nt':
import ctypes
ctypes.windll.kernel32.SetConsoleTitleW("PyLink %s" % __version__)
elif os.name == 'posix':
sys.stdout.write("\x1b]2;PyLink %s\x07" % __version__)
# Write the PID file only after forking.
with open(pidfile, 'w') as f:
f.write(str(os.getpid()))
# Load configured plugins # Load configured plugins
to_load = conf.conf['plugins'] to_load = conf.conf['plugins']
utils._reset_module_dirs() utils._reset_module_dirs()