From 42125b9887999c0b39f8ded544aa32c14b071ebe Mon Sep 17 00:00:00 2001 From: l_samenv Date: Thu, 22 Dec 2022 16:36:47 +0100 Subject: [PATCH] fix restart without cfg restart did not work when no cfg was given and process was in zombie state + fix restart 'all' --- base.py | 19 ++++++++++++------- frappyman.py | 9 +++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/base.py b/base.py index 0f4c18e..e909345 100644 --- a/base.py +++ b/base.py @@ -170,7 +170,9 @@ class ServiceManager: def get_procs(self, groups=None, cfginfo=None): """return processes - result is a dict[ins] of dict[service] of list of tuples (process, cfg) + :param groups: group to look for or None for all groups + :param cfginfo: cfginfo dict to be populated + :result: a dict[ins] of dict[service] of list of tuples (process, cfg) """ result = {} @@ -240,12 +242,11 @@ class ServiceManager: try: p.wait(0.1 * i) except psutil.TimeoutExpired: - if p.status() == psutil.STATUS_ZOMBIE: - break - if print_wait and i > 4: - print('wait for %s %s' % (ins, service)) - print_wait = False - continue + if p.status() != psutil.STATUS_ZOMBIE: + if print_wait and i > 4: + print('wait for %s %s' % (ins, service)) + print_wait = False + continue self.stopped[ins][service] = ' '.join(p.info['cmdline']) break else: @@ -368,8 +369,12 @@ class ServiceManager: os.chdir(wd) def do_restart(self, ins, service=None, cfg=None, logger=None): + if ins is None: + raise UsageError("need instance or 'all' or wildcard") ins_list = self.wildcard(ins) if ins_list is not None: + if cfg is not None: + raise UsageError('can not restart several instances with %s' % cfg) return ins_list self.do_start(ins, service, cfg, True, logger=logger) diff --git a/frappyman.py b/frappyman.py index 1ad5da6..fdefec4 100644 --- a/frappyman.py +++ b/frappyman.py @@ -94,6 +94,15 @@ class FrappyManager(ServiceManager): raise UsageError('need service to start (one of %s)' % ', '.join(self.services)) super().do_start(ins, service, cfg, restart, wait, logger) + def do_restart(self, ins, service=None, cfg=None, logger=None): + ins_list = super().do_restart(ins, service, cfg, logger) + if ins_list: # wildcard used + # determine running processes with cfg + cfginfo = {} + self.get_procs(None, cfginfo) + cfgs = {i for i, s in cfginfo if s == service or service is None} + return [i for i in ins_list if i in cfgs] + def check_server(self, ins='', service='main'): start_dir, env = self.prepare_start(ins, service) sys.path.insert(0, start_dir)