package com.hubspot.singularity.executor.shells; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Date; import java.util.concurrent.Callable; import org.slf4j.Logger; import com.google.common.base.Charsets; import com.google.common.base.Optional; import com.hubspot.mesos.JavaUtils; import com.hubspot.singularity.SingularityTaskShellCommandUpdate.UpdateType; import com.hubspot.singularity.runner.base.shared.SafeProcessManager; public class SingularityExecutorShellCommandRunnerCallable extends SafeProcessManager implements Callable<Integer> { private final SingularityExecutorShellCommandUpdater updater; private final ProcessBuilder processBuilder; private final File outputFile; public SingularityExecutorShellCommandRunnerCallable(Logger log, SingularityExecutorShellCommandUpdater updater, ProcessBuilder processBuilder, File outputFile) { super(log); this.processBuilder = processBuilder; this.updater = updater; this.outputFile = outputFile; } @Override public Integer call() throws Exception { try (final PrintWriter outputWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(outputFile, true), Charsets.UTF_8))) { outputWriter.println("#"); outputWriter.println(String.format("# %s -- Launching %s", new Date(), JavaUtils.SPACE_JOINER.join(processBuilder.command()))); outputWriter.println("#"); } Process process = startProcess(processBuilder); Optional<Integer> pid = getCurrentPid(); updater.sendUpdate(UpdateType.STARTED, Optional.of(String.format("pid - %s", pid.orNull())), Optional.<String>absent()); try { return process.waitFor(); } catch (InterruptedException ie) { signalKillToProcessIfActive(); throw ie; } } }