class_docstr: SSHTunnel represents a control to start, stop and check an SSH tunnel status.
  Its internal state could be serialized to a file and restored from it using pydantic.
code: def start(self):
      logger.info("Starting SSH tunnel for %s", self.sock_path)
      logger.debug("Executing %s", shlex.join(self.start_cmd))
      try:
          # do not capture output or it hangs
          r = subprocess.run(self.start_cmd, timeout=10)
      except subprocess.TimeoutExpired:
          raise SSHError("Timeout exceeded")
      if r.returncode != 0:
          raise SSHError("SSH tunnel failed to start")
  
file_path: dstack/gateway/src/dstack/gateway/services/tunnel.py
imports: import logging
  import os
  import shlex
  import shutil
  import subprocess
  import tempfile
  from typing import List, Optional
  from pydantic import BaseModel
  from dstack.gateway.errors import SSHError
label_desc: Use image node_id 3 for calling the SSHTunnel obj's underlying member method code with example usage: obj.start() without return types