X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/be49f06e0696fd148deb5c95dd7b847855ac6a9f..3dc285a9ac21a377d5a81d6681e97becc0c2f286:/pymin/procman.py diff --git a/pymin/procman.py b/pymin/procman.py index c8a8574..269117b 100644 --- a/pymin/procman.py +++ b/pymin/procman.py @@ -26,7 +26,7 @@ class ProcessInfo: self._dont_run = False self._signal = None self._process = None - self.error_count = 0 + self._error_count = 0 def start(self): assert self.process is None self.restart() @@ -59,13 +59,16 @@ class ProcessInfo: @property def process(self): return self._process + @property + def error_count(self): + return self._error_count def __repr__(self): pid = None if self.process is not None: pid = self.process.pid return 'ProcessInfo(name=%s, pid=%s command=%s, persist=%s, cb=%s)' % ( self.name, pid, self.command, self.persist, - self.callback.__name__) + self.callback and self.callback.__name__ or None) class ProcessManager: @@ -75,19 +78,27 @@ class ProcessManager: self.pidmap = dict() log.debug(u'ProcessManager()') - def register(self, name, command, callback=None, persist=False, + def register(self, name, command=None, callback=None, persist=False, max_errors=3, *args, **kwargs): log.debug(u'ProcessManager.register(%s, %s, %s, %s, %s, %s, %s)', name, command, callback, persist, max_errors, args, kwargs) + if not isinstance(name, ProcessInfo): + pi = ProcessInfo(name, command, callback, persist, max_errors, + args, kwargs) + else: + pi = name + name = pi.name assert not self.has(name) - pi = ProcessInfo(name, command, callback, persist, max_errors, - args, kwargs) self.services[name] = pi return pi def unregister(self, name): log.debug(u'ProcessManager.unregister(%s)', name) - pi = self.services[name] + if isinstance(name, ProcessInfo): + pi = name + name = pi.name + else: + pi = self.services[name] del self.services[name] return pi @@ -95,28 +106,42 @@ class ProcessManager: pi.start() self.namemap[pi.name] = self.pidmap[pi.process.pid] = pi - def once(self, name, command, callback=None, persist=False, + def once(self, name, command=None, callback=None, persist=False, max_errors=3, *args, **kwargs): log.debug(u'ProcessManager.once(%s, %s, %s, %s, %s, %s, %s)', name, command, callback, persist, max_errors, args, kwargs) + if not isinstance(name, ProcessInfo): + pi = ProcessInfo(name, command, callback, persist, max_errors, + args, kwargs) + else: + pi = name + name = pi.name assert not self.has(name) - pi = ProcessInfo(name, command, callback, persist, max_errors, - args, kwargs) self._call(pi) return pi def start(self, name): log.debug(u'ProcessManager.start(%s)', name) - assert name not in self.namemap - self._call(self.services[name]) + if isinstance(name, ProcessInfo): + name = name.name + if name not in self.namemap: + self._call(self.services[name]) + return True + return False def stop(self, name): log.debug(u'ProcessManager.stop(%s)', name) - assert name in self.namemap - self.namemap[name].stop() + if isinstance(name, ProcessInfo): + name = name.name + if name in self.namemap: + self.namemap[name].stop() + return True + return False def restart(self, name): log.debug(u'ProcessManager.restart(%s)', name) + if isinstance(name, ProcessInfo): + name = name.name # we have to check first in namemap in case is an unregistered # process (added with once()) if name in self.namemap: @@ -128,13 +153,19 @@ class ProcessManager: pi.restart() # add the new PID self.pidmap[pi.process.pid] = pi + return True else: self.start(name) + return False def kill(self, name, signum): log.debug(u'ProcessManager.kill(%s, %s)', name, signum) - assert name in self.namemap - self.namemap[name].kill(name, stop) + if isinstance(name, ProcessInfo): + name = name.name + if name in self.namemap: + self.namemap[name].kill(name, stop) + return True + return False def sigchild_handler(self, signum, stack_frame=None): log.debug(u'ProcessManager.sigchild_handler(%s)', signum) @@ -156,24 +187,25 @@ class ProcessManager: log.debug(u'ProcessManager.sigchild_handler: ' u'calling %s(%s)', p.callback.__name__, p) p.callback(self, p) - if p._dont_run or not p.persist or p.error_count >= p.max_errors: + if (p._dont_run or not p.persist + or p._error_count >= p.max_errors): log.debug(u"ProcessManager.sigchild_handler: can't " u'persist, dont_run=%s, persist=%s, error_cout=%s, ' u'max_errors=%s', p._dont_run, p.persist, - p.error_count, p.max_errors) + p._error_count, p.max_errors) del self.namemap[p.name] del self.pidmap[pid] p.clear() else: log.debug(u'ProcessManager.sigchild_handler: persist') if p.process.returncode == 0: - p.error_count = 0 + p._error_count = 0 log.debug(u'ProcessManager.sigchild_handler: ' u'return OK, resetting error_count') else: - p.error_count += 1 + p._error_count += 1 log.debug(u'ProcessManager.sigchild_handler: return' - u'not 0, error_count + 1 = %s', p.error_count) + u'not 0, error_count + 1 = %s', p._error_count) del self.pidmap[pid] p.restart() self.pidmap[p.process.pid] = p