Search code examples
javamultithreadingprocessbuilderjava-threads

process.waitFor(timeout, timeUnit) does not quit the process after specified time


I'm trying to execute a visual basic script code in my java application using process builder. As script provided by the user might not finish its execution in time, I want to provide means to limit this execution time. In the following code, you can see my logic but it doesn't really do what it supposed to do. How can I make this waitfor work in order to limit the execution time?

private void run(String scriptFilePath) throws ScriptPluginException {
BufferedReader input = null;
BufferedReader error = null;

try {

    ProcessBuilder p = new ProcessBuilder("cscript.exe", "//U", "\"" + scriptFilePath + "\"");

    String path = "";

    if (scriptFilePath.indexOf("/") != -1) {
        path = scriptFilePath.substring(0, scriptFilePath.lastIndexOf("/"));
    }

    path += "/" + "tempvbsoutput.txt";
    p.redirectOutput(new File(path));
    Process pp = p.start();

    try {
        pp.waitFor(executionTimeout, TimeUnit.MINUTES);     
    } catch (InterruptedException e) {
        SystemLog.writeError(jobId, ScriptConsts.COMPONENT_ID, "VBScriptExecutor", "run", 80401104,
                "VB Script executes fail.");
    } 

    if (!pp.isAlive()) {
        pp.getOutputStream().close();
    }

    // rest of the code flow 

}


Solution

  • Process.waitFor(long, TimeUnit) waits until the process has terminated or the specified time elapsed (Javadoc). The return value indicates whether the process exited or not.

    if (process.waitFor(1, TimeUnit.MINUTES)) {
        System.out.println("process exited");
    } else {
        System.out.println("process is still running");
    }
    

    waitFor() does not kill the process after the time elapsed.

    If you want to kill the subprocess, use either destroy() or destroyForcibly().