def _start_slave(self): """ Starts a new slave worker process. """ pid = os.fork() if pid == 0: # Set up the command line and logger id set_cmdline('vsmtpd: worker') log.connection_id = 'worker' # Call event_reinit() gevent.reinit() # Start vsmtpd self._start(self.sock) else: log.info('Worker spawned PID %d', pid) self.workers.append(pid)
def start(self): """ Starts the vsmtpd server in either master or worker mode. """ # Install the signal handlers signal.signal(signal.SIGTERM, self.stop) signal.signal(signal.SIGHUP, self.reload) signal.signal(signal.SIGINT, self.stop) workers = self.config.getint('workers') backlog = self.config.getint('backlog') addr = ('0.0.0.0', 2500) if backlog < 1: backlog = 50 log.info('Starting server on %s port %d', *addr) if workers <= 0: set_cmdline('vsmtpd: master') self._start(addr, backlog) # Open the socket for master/worker operation. self.sock = socket.socket() self.sock.bind(addr) self.sock.listen(backlog) self.sock.setblocking(0) # Spawn the worker servers for i in xrange(0, workers): self._start_slave() # Set the process title set_cmdline('vsmtpd: master') # Wait for the children to die try: os.waitpid(-1, 0) except OSError: pass
def tearDown(self): set_cmdline(self.cmdline) set_procname(self.procname)
def test_set_cmdline(self): set_cmdline('vsmtpd: master') self.assertEqual(get_procname(), 'vsmtpd: master') cmdline = open('/proc/%d/cmdline' % os.getpid()).read().rstrip('\0') self.assertEqual(cmdline, 'vsmtpd: master')