code: def run(self):
      
      # Prevent the KeyboardInterrupt being raised inside the process.
      # This will prevent a process from generating a traceback when interrupted.
      signal.signal(signal.SIGINT, signal.SIG_IGN)
  
      # A SIGTERM signal handler is necessary to make sure IPC is cleaned up
      # correctly on terminate.
      signal.signal(signal.SIGTERM, self._SigTermHandler)
  
      # A SIGSEGV signal handler is necessary to try to indicate where
      # worker failed.
      # WARNING the SIGSEGV handler will deadlock the process on a real segfault.
      if self._enable_sigsegv_handler:
        self._original_sigsegv_handler = signal.signal(
            signal.SIGSEGV, self._SigSegvHandler)
  
      self._pid = os.getpid()
      self._process_information = process_info.ProcessInfo(self._pid)
  
      # We need to set the is running status explicitly to True in case
      # the process completes before the engine is able to determine
      # the status of the process, e.g. in the unit tests.
      self._status_is_running = True
  
      # Logging needs to be configured before the first output otherwise we
      # mess up the logging of the parent process.
      loggers.ConfigureLogging(
          debug_output=self._debug_output, filename=self._log_filename,
          quiet_mode=self._quiet_mode)
  
      logger.debug(
          'Process: {0!s} (PID: {1:d}) started'.format(self._name, self._pid))
  
      self._StartProcessStatusRPCServer()
  
      self._Main()
  
      self._StopProcessStatusRPCServer()
  
      logger.debug(
          'Process: {0!s} (PID: {1:d}) stopped'.format(self._name, self._pid))
  
      # Make sure log files are cleanly closed.
      logging.shutdown()
  
      self._status_is_running = False
docs: Runs the process.