private WorkerJvm startWorkerJvm() throws IOException {
    int workerIndex = workerJvmSettings.getWorkerIndex();
    WorkerType type = workerJvmSettings.getWorkerType();

    SimulatorAddress workerAddress =
        new SimulatorAddress(AddressLevel.WORKER, agent.getAddressIndex(), workerIndex, 0);
    String workerId =
        "worker-" + agent.getPublicAddress() + '-' + workerIndex + '-' + type.toLowerCase();
    File workerHome = new File(testSuiteDir, workerId);
    ensureExistingDirectory(workerHome);

    WorkerJvm workerJvm = new WorkerJvm(workerAddress, workerId, workerHome);

    generateWorkerStartScript(type, workerJvm);

    ProcessBuilder processBuilder =
        new ProcessBuilder(new String[] {"bash", "worker.sh"})
            .directory(workerHome)
            .redirectErrorStream(true);

    Map<String, String> environment = processBuilder.environment();
    String javaHome = getJavaHome();
    String path = javaHome + File.pathSeparator + "bin:" + environment.get("PATH");
    environment.put("PATH", path);
    environment.put("JAVA_HOME", javaHome);

    Process process = processBuilder.start();
    workerJvm.setProcess(process);
    copyResourcesToWorkerId(workerId);
    workerJvmManager.add(workerAddress, workerJvm);

    return workerJvm;
  }