mirror of
https://github.com/alexgo-io/stacks-puppet-node.git
synced 2026-04-23 19:31:00 +08:00
fix bugs in daemonization logic
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user