fix bugs in daemonization logic

This commit is contained in:
Jude Nelson
2017-02-25 00:40:39 -05:00
parent 25cd1052f3
commit 05736acc36
2 changed files with 26 additions and 10 deletions

View File

@@ -3519,11 +3519,16 @@ def local_api_start( port=None, config_dir=blockstack_constants.CONFIG_DIR, fore
logpath = local_api_logfile_path(config_dir=config_dir)
res = daemonize(logpath, child_wait=lambda: local_api_start_wait(config_path=config_path))
if not res:
if res < 0:
log.error("API server failed to start")
return False
# daemon now...
if res > 0:
# parent
log.debug("Parent {} forked intermediate child {}".format(os.getpid(), res))
return True
# daemon child takes this path...
atexit.register(local_api_atexit)
# load up internal RPC methods

View File

@@ -23,9 +23,11 @@
import json
import sys
import os
import signal
from config import get_logger
log = get_logger()
log = get_logger('blockstack-client')
def exit_with_error(error_message, help_message=None):
@@ -101,8 +103,8 @@ def daemonize( logpath, child_wait=None ):
to block its exit until the child is "ready"
(i.e. child_wait() returns)
Return True on success
Return False on error
Return 0 if we're the daemon child
Return >0 if we're the parent
"""
logfile = open(logpath, 'a+')
@@ -117,13 +119,17 @@ def daemonize( logpath, child_wait=None ):
daemon_pid = os.fork()
if daemon_pid == 0:
# daemon!
# daemon! chdir and return
os.chdir('/')
return 0
elif daemon_pid > 0:
# parent (intermediate child)
# wait for child to fully initialize...
res = child_wait()
res = True
if child_wait is not None:
res = child_wait()
if res:
sys.exit(0)
else:
@@ -138,9 +144,14 @@ def daemonize( logpath, child_wait=None ):
# wait for intermediate child
pid, status = os.waitpid(child_pid, 0)
if os.WEXITSTATUS(status) == 0:
return True
return child_pid
else:
log.error("Child exit status {}".format(status))
return False
return -1
else:
# failed to fork
log.error("Failed to fork")
return -1
return True
return 0