use of org.objectweb.proactive.extensions.processbuilder.OSProcessBuilder in project scheduling by ow2-proactive.
the class ForkedProcessBuilderCreatorTest method testEnvPrefixCommandIsAddedToCommandRunAsMeIsTrue.
@Test
public void testEnvPrefixCommandIsAddedToCommandRunAsMeIsTrue() throws Exception {
ForkedProcessBuilderCreator forkedProcessBuilderCreator = new ForkedProcessBuilderCreator();
setMocks(forkedProcessBuilderCreator);
TaskContext taskContext = createTaskContext();
taskContext.getExecutableContainer().setRunAsUser(true);
OSProcessBuilder processBuilder = forkedProcessBuilderCreator.createForkedProcessBuilder(createTaskContext(), tmpFolder.newFolder(), System.out, System.out, tmpFolder.newFolder());
assertThat(processBuilder.command(), hasItems(forkEnJavaCommandString));
}
use of org.objectweb.proactive.extensions.processbuilder.OSProcessBuilder in project scheduling by ow2-proactive.
the class ForkedTaskExecutor method execute.
@Override
public TaskResultImpl execute(TaskContext context, PrintStream outputSink, PrintStream errorSink) {
CookieBasedProcessTreeKiller taskProcessTreeKiller = null;
Process process = null;
ProcessStreamsReader processStreamsReader = null;
File serializedContext = null;
try {
if (!workingDir.exists()) {
FileUtils.forceMkdir(workingDir);
}
serializedContext = taskContextSerializer.serializeContext(context, workingDir);
OSProcessBuilder processBuilder = forkedJvmProcessBuilderCreator.createForkedProcessBuilder(context, serializedContext, outputSink, errorSink, workingDir);
TaskId taskId = context.getTaskId();
if (context.getInitializer().getGenericInformation() == null || !"true".equalsIgnoreCase(context.getInitializer().getGenericInformation().get(SchedulerConstants.DISABLE_PROCESS_TREE_KILLER_GENERIC_INFO))) {
String cookieNameSuffix = "Job" + taskId.getJobId().value() + "Task" + taskId.value();
taskProcessTreeKiller = CookieBasedProcessTreeKiller.createProcessChildrenKiller(cookieNameSuffix, processBuilder.environment());
}
process = processBuilder.start();
processStreamsReader = new ProcessStreamsReader(taskId.toString(), process, outputSink, errorSink);
int exitCode = process.waitFor();
if (exitCode != 0) {
try {
Object error = deserializeTaskResult(serializedContext);
if (error instanceof TaskContext) {
return createTaskResult(context, new IOException("Forked JVM process returned with exit code " + exitCode + ", see task logs for more information"));
} else {
Throwable exception = (Throwable) error;
return createTaskResult(context, exception);
}
} catch (Throwable cannotDeserializeResult) {
return createTaskResult(context, cannotDeserializeResult);
}
}
return (TaskResultImpl) deserializeTaskResult(serializedContext);
} catch (Throwable throwable) {
return createTaskResult(context, throwable);
} finally {
FileUtils.deleteQuietly(serializedContext);
if (process != null) {
logger.info("killing forked JVM process");
process.destroy();
try {
// wait for twice the time of the cleanup process
process.waitFor((new CleanupTimeoutGetter()).getCleanupTimeSeconds(), TimeUnit.SECONDS);
logger.info("JVM process killed");
} catch (Exception e) {
logger.info("Exception while waiting task to finish " + e);
}
}
if (taskProcessTreeKiller != null) {
taskProcessTreeKiller.kill();
}
if (processStreamsReader != null) {
processStreamsReader.close();
}
}
}
use of org.objectweb.proactive.extensions.processbuilder.OSProcessBuilder in project scheduling by ow2-proactive.
the class ForkedProcessBuilderCreatorTest method testForEnvPrefixCommandIsAddedToCommand.
@Test
public void testForEnvPrefixCommandIsAddedToCommand() throws Exception {
ForkedProcessBuilderCreator forkedProcessBuilderCreator = new ForkedProcessBuilderCreator();
setMocks(forkedProcessBuilderCreator);
OSProcessBuilder processBuilder = forkedProcessBuilderCreator.createForkedProcessBuilder(createTaskContext(), tmpFolder.newFolder(), System.out, System.out, tmpFolder.newFolder());
assertThat(processBuilder.command(), hasItems(forkEnJavaCommandString));
}
use of org.objectweb.proactive.extensions.processbuilder.OSProcessBuilder in project scheduling by ow2-proactive.
the class ForkedProcessBuilderCreator method getOsProcessBuilder.
private OSProcessBuilder getOsProcessBuilder(TaskContext context, File workingDir, String nativeScriptPath) throws IOException, IllegalAccessException, KeyException {
OSProcessBuilder processBuilder;
if (context.isRunAsUser()) {
addExecutionPermissionToScripts();
forkerUtils.setSharedExecutablePermissions(workingDir);
processBuilder = forkerUtils.getOSProcessBuilderFactory(nativeScriptPath).getBuilder(forkerUtils.checkConfigAndGetUser(context));
} else {
processBuilder = forkerUtils.getOSProcessBuilderFactory(nativeScriptPath).getBuilder();
}
return processBuilder;
}
use of org.objectweb.proactive.extensions.processbuilder.OSProcessBuilder in project scheduling by ow2-proactive.
the class ForkedProcessBuilderCreator method createForkedProcessBuilder.
/**
* Creates a process builder for a given task context.
*
* @param context The task context to execute.
* @param serializedContext The task context saved to disk.
* @param outputSink Standard output sink.
* @param errorSink Error sink.
* @param workingDir The working directory to execute the process in.
* @return Returns a process builder, ready to execute.
* @throws Exception
*/
public OSProcessBuilder createForkedProcessBuilder(TaskContext context, File serializedContext, PrintStream outputSink, PrintStream errorSink, File workingDir) throws Exception {
String nativeScriptPath = context.getSchedulerHome();
OSProcessBuilder processBuilder = getOsProcessBuilder(context, workingDir, nativeScriptPath);
ScriptResult forkEnvironmentScriptResult = executeForkEnvironmentScriptAndExtractVariables(context, outputSink, errorSink, processBuilder);
processBuilder.command().addAll(forkedJvmTaskExecutionCommandCreator.createForkedJvmTaskExecutionCommand(context, forkEnvironmentScriptResult, serializedContext.getAbsolutePath()));
processBuilder = processBuilder.directory(workingDir);
return processBuilder;
}
Aggregations