+ log.debug(u'ProcessManager()')
+
+ def register(self, name, command, 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)
+ 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]
+ del self.services[name]
+ return pi
+
+ def _call(self, pi):
+ pi.start()
+ self.namemap[pi.name] = self.pidmap[pi.process.pid] = pi
+
+ def once(self, name, command, 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)
+ 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)
+ 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)
+ if name in self.namemap:
+ self.namemap[name].stop()
+ return True
+ return False
+
+ def restart(self, name):
+ log.debug(u'ProcessManager.restart(%s)', name)
+ # we have to check first in namemap in case is an unregistered
+ # process (added with once())
+ if name in self.namemap:
+ pi = self.namemap[name]
+ # the process will change its PID, so we delete it while we know it
+ del self.pidmap[pi.process.pid]
+ pi.stop()
+ pi.process.wait()
+ pi.restart()
+ # add the new PID
+ self.pidmap[pi.process.pid] = pi
+ return True
+ else:
+ self.start(name)
+ return False