From 15adf81954e8297413b2a2383fdbabea0d1f9462 Mon Sep 17 00:00:00 2001 From: Tom Goff Date: Mon, 31 Aug 2015 11:31:57 -0400 Subject: [PATCH] daemon: Use a master script to start node services. This helps starting services with dependencies by running service start commands serially. --- daemon/core/service.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/daemon/core/service.py b/daemon/core/service.py index ccd19354..dae9ce43 100644 --- a/daemon/core/service.py +++ b/daemon/core/service.py @@ -217,6 +217,7 @@ class CoreServices(ConfigurableManager): ''' services = sorted(node.services, key=lambda service: service._startindex) + script = '#!/bin/sh\n\n' for s in services: if len(str(s._starttime)) > 0: try: @@ -227,15 +228,17 @@ class CoreServices(ConfigurableManager): continue except ValueError: pass - self.bootnodeservice(node, s, services) - + script += self.bootnodeservice(node, s, services) + filename = 'start-all-services.sh' + node.nodefile(filename, script) + node.cmd(('/bin/sh', filename), wait = False) + def bootnodeservice(self, node, s, services): ''' Start a service on a node. Create private dirs, generate config files, and execute startup commands. ''' if s._custom: - self.bootnodecustomservice(node, s, services) - return + return self.bootnodecustomservice(node, s, services) if node.verbose: node.info("starting service %s (%s)" % (s._name, s._startindex)) for d in s._dirs: @@ -247,12 +250,10 @@ class CoreServices(ConfigurableManager): for filename in s.getconfigfilenames(node.objid, services): cfg = s.generateconfig(node, filename, services) node.nodefile(filename, cfg) - for cmd in s.getstartup(node, services): - try: - # NOTE: this wait=False can be problematic! - node.cmd(shlex.split(cmd), wait = False) - except Exception, e: - node.warn("error starting command %s: %s" % (cmd, e)) + startup = '\n'.join(s.getstartup(node, services)) + if startup: + startup += '\n' + return startup def bootnodecustomservice(self, node, s, services): ''' Start a custom service on a node. Create private dirs, use supplied @@ -283,14 +284,11 @@ class CoreServices(ConfigurableManager): "error copying service file '%s': %s" % (filename, e)) continue node.nodefile(filename, cfg) - - for cmd in s._startup: - try: - # NOTE: this wait=False can be problematic! - node.cmd(shlex.split(cmd), wait = False) - except Exception, e: - node.warn("error starting command %s: %s" % (cmd, e)) - + startup = '\n'.join(s._startup) + if startup: + startup += '\n' + return startup + def copyservicefile(self, node, filename, cfg): ''' Given a configured service filename and config, determine if the config references an existing file that should be copied.