def start(self):
        """Start the process.

        This will block until the Crate cluster is ready to process requests.
        """
        log.info('Starting Crate process')
        self.process = proc = self.enter_context(subprocess.Popen(
            self.cmd,
            stdin=subprocess.DEVNULL,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            env=self.env,
            universal_newlines=True
        ))

        msg = ('CrateDB launching:\n'
               '    PID: %s\n'
               '    Logs: %s\n'
               '    Data: %s')
        if not self.keep_data:
            msg += ' (removed on stop)\n'

        logfile = os.path.join(self.logs_path, self.cluster_name + '.log')
        log.info(
            msg,
            proc.pid,
            logfile,
            self.data_path
        )
        self.addresses = DotDict({})
        self.monitor.consumers.append(AddrConsumer(self._set_addr))
        self.monitor.start(proc)

        log_lines = []
        self.monitor.consumers.append(log_lines.append)
        spinner = cycle(['/', '-', '\\', '|'])

        def show_spinner():
            if sys.stdout.isatty():
                print(next(spinner), end='\r')
            return True
        try:
            wait_until(
                lambda: show_spinner() and _ensure_running(proc) and self.http_host,
                timeout=60
            )
            host = self.addresses.http.host
            port = self.addresses.http.port
            wait_until(
                lambda: _ensure_running(proc) and _is_up(host, port),
                timeout=30
            )
            if _has_ssl(host, port):
                self.http_url = self.http_url.replace('http://', 'https://')
            wait_until(
                lambda: show_spinner() and cluster_state_200(self.http_url),
                timeout=30
            )
        except (SystemError, TimeoutError):
            if not log_lines:
                _try_print_log(logfile)
            else:
                for line in log_lines:
                    log.error(line)
            raise SystemExit("Exiting because CrateDB didn't start correctly")
        else:
            self.monitor.consumers.remove(log_lines.append)
        log.info('Cluster ready to process requests')