code: def join(self, ignore_errors=False):
      
      assert self._status_fn, "Asked to join a task which hasn't had any commands executed on it"
      check_interval = 0.2
      status_fn = self._status_fn
      if not self.wait_for_file(status_fn, max_wait_sec=30):
        self.log(f"Retrying waiting for {status_fn}")
      while not self.exists(status_fn):
        self.log(f"Still waiting for {self._cmd}")
        self.wait_for_file(status_fn, max_wait_sec=30)
      contents = self.read(status_fn)
  
      # if empty wait a bit to allow for race condition
      if len(contents) == 0:
        time.sleep(check_interval)
        contents = self.read(status_fn)
      status = int(contents.strip())
      self.last_status = status
  
      if status != 0:
        extra_msg = '(ignoring error)' if ignore_errors else '(failing)'
        if util.is_set('NCLUSTER_RUN_WITH_OUTPUT_ON_FAILURE') or True:
          self.log(
            f"Start failing output {extra_msg}: \n{'*'*80}\n\n '{self.read(self._out_fn)}'")
          self.log(f"\n{'*'*80}\nEnd failing output")
        if not ignore_errors:
          raise RuntimeError(f"Command {self._cmd} returned status {status}")
        else:
          self.log(f"Warning: command {self._cmd} returned status {status}")
  
      return status
docs: Waits until last executed command completed.