def start(self, multiplex_sockets=False):
    self.log.info(self.welcome_msg)
    if self.state != ControllerState.DEAD:
      self.log.warn("Starting controller %s when it is not dead!" % self.label)
      return
    if self.config.start_cmd == "":
      raise RuntimeError(
        "No command found to start controller %s!" % self.label)
    self.log.info(
      "Launching controller %s: %s" % (
        self.label, " ".join(self.config.expanded_start_cmd)))
    # These configurations are specific to controllers launched in namespaces
    # Probably it should be factored somewhere else
    launch_in_network_namespace = getattr(self.config,
                                          'launch_in_network_namespace', None)
    if launch_in_network_namespace:
      unclaimed_address = IPAddressSpace.find_unclaimed_address(
        ip_prefix=self.config.address)
      (self.process, self.guest_eth_addr, self.host_device) = \
          launch_namespace(" ".join(self.config.expanded_start_cmd),
                           self.config.address, self.cid,
                           host_ip_addr_str=unclaimed_address)
    else:
      self.process = popen_filtered("[%s]" % self.label,
                                    self.config.expanded_start_cmd,
                                    self.config.cwd)
    self._register_proc(self.process)
    self._check_snapshot_connect()
    self.state = ControllerState.ALIVE
Start a new controller process based on the config's start_cmd
dataset/ETHPy150Open ucb-sts/sts/sts/entities/controllers.py/Controller.start