fix restart without cfg

restart did not work when no cfg was given and process was
in zombie state

+ fix restart 'all'
This commit is contained in:
l_samenv 2022-12-22 16:36:47 +01:00
parent 91cf31dde5
commit 42125b9887
2 changed files with 21 additions and 7 deletions

19
base.py
View File

@ -170,7 +170,9 @@ class ServiceManager:
def get_procs(self, groups=None, cfginfo=None): def get_procs(self, groups=None, cfginfo=None):
"""return processes """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 = {} result = {}
@ -240,12 +242,11 @@ class ServiceManager:
try: try:
p.wait(0.1 * i) p.wait(0.1 * i)
except psutil.TimeoutExpired: except psutil.TimeoutExpired:
if p.status() == psutil.STATUS_ZOMBIE: if p.status() != psutil.STATUS_ZOMBIE:
break if print_wait and i > 4:
if print_wait and i > 4: print('wait for %s %s' % (ins, service))
print('wait for %s %s' % (ins, service)) print_wait = False
print_wait = False continue
continue
self.stopped[ins][service] = ' '.join(p.info['cmdline']) self.stopped[ins][service] = ' '.join(p.info['cmdline'])
break break
else: else:
@ -368,8 +369,12 @@ class ServiceManager:
os.chdir(wd) os.chdir(wd)
def do_restart(self, ins, service=None, cfg=None, logger=None): 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) ins_list = self.wildcard(ins)
if ins_list is not None: if ins_list is not None:
if cfg is not None:
raise UsageError('can not restart several instances with %s' % cfg)
return ins_list return ins_list
self.do_start(ins, service, cfg, True, logger=logger) self.do_start(ins, service, cfg, True, logger=logger)

View File

@ -94,6 +94,15 @@ class FrappyManager(ServiceManager):
raise UsageError('need service to start (one of %s)' % ', '.join(self.services)) raise UsageError('need service to start (one of %s)' % ', '.join(self.services))
super().do_start(ins, service, cfg, restart, wait, logger) 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'): def check_server(self, ins='', service='main'):
start_dir, env = self.prepare_start(ins, service) start_dir, env = self.prepare_start(ins, service)
sys.path.insert(0, start_dir) sys.path.insert(0, start_dir)