/**
   * Recover an already existing container. This is a blocking call and returns only when the
   * container exits. Note that the container must have been activated prior to this call.
   *
   * @param ctx encapsulates information necessary to reacquire container
   * @return The exit code of the pre-existing container
   * @throws IOException
   * @throws InterruptedException
   */
  public int reacquireContainer(ContainerReacquisitionContext ctx)
      throws IOException, InterruptedException {
    Container container = ctx.getContainer();
    String user = ctx.getUser();
    ContainerId containerId = ctx.getContainerId();

    Path pidPath = getPidFilePath(containerId);
    if (pidPath == null) {
      LOG.warn(containerId + " is not active, returning terminated error");
      return ExitCode.TERMINATED.getExitCode();
    }

    String pid = null;
    pid = ProcessIdFileReader.getProcessId(pidPath);
    if (pid == null) {
      throw new IOException("Unable to determine pid for " + containerId);
    }

    LOG.info("Reacquiring " + containerId + " with pid " + pid);
    ContainerLivenessContext livenessContext =
        new ContainerLivenessContext.Builder()
            .setContainer(container)
            .setUser(user)
            .setPid(pid)
            .build();
    while (isContainerAlive(livenessContext)) {
      Thread.sleep(1000);
    }

    // wait for exit code file to appear
    String exitCodeFile = ContainerLaunch.getExitCodeFile(pidPath.toString());
    File file = new File(exitCodeFile);
    final int sleepMsec = 100;
    int msecLeft = 2000;
    while (!file.exists() && msecLeft >= 0) {
      if (!isContainerActive(containerId)) {
        LOG.info(containerId + " was deactivated");
        return ExitCode.TERMINATED.getExitCode();
      }

      Thread.sleep(sleepMsec);

      msecLeft -= sleepMsec;
    }
    if (msecLeft < 0) {
      throw new IOException("Timeout while waiting for exit code from " + containerId);
    }

    try {
      return Integer.parseInt(FileUtils.readFileToString(file).trim());
    } catch (NumberFormatException e) {
      throw new IOException("Error parsing exit code from pid " + pid, e);
    }
  }
 /**
  * Get the process-identifier for the container
  *
  * @param containerID
  * @return the processid of the container if it has already launched, otherwise return null
  */
 public String getProcessId(ContainerId containerID) {
   String pid = null;
   Path pidFile = pidFiles.get(containerID);
   if (pidFile == null) {
     // This container isn't even launched yet.
     return pid;
   }
   try {
     pid = ProcessIdFileReader.getProcessId(pidFile);
   } catch (IOException e) {
     LOG.error("Got exception reading pid from pid-file " + pidFile, e);
   }
   return pid;
 }