19 package org.sleuthkit.autopsy.coreutils;
21 import com.sun.javafx.PlatformUtil;
22 import java.io.BufferedReader;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.io.Writer;
27 import java.util.Date;
28 import java.util.List;
29 import java.util.concurrent.TimeUnit;
30 import java.util.logging.Level;
69 return Thread.currentThread().isInterrupted();
90 this.startTimeInSeconds = (
new Date().getTime()) / 1000;
106 this.maxRunTimeInSeconds = Long.MAX_VALUE;
108 this.startTimeInSeconds = (
new Date().getTime()) / 1000;
113 long currentTimeInSeconds = (
new Date().getTime()) / 1000;
130 public static int execute(ProcessBuilder processBuilder)
throws SecurityException, IOException {
133 public boolean shouldTerminateProcess() {
171 public static int execute(ProcessBuilder processBuilder,
long timeOut, TimeUnit units,
ProcessTerminator terminator)
throws SecurityException, IOException {
172 Process process = processBuilder.start();
175 process.waitFor(timeOut, units);
176 if (process.isAlive() && terminator.shouldTerminateProcess()) {
180 }
catch (InterruptedException exx) {
181 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
184 }
while (process.isAlive());
185 }
catch (InterruptedException ex) {
186 if (process.isAlive()) {
191 }
catch (InterruptedException exx) {
192 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
194 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO,
"Thread interrupted while running {0}", processBuilder.command().get(0));
195 Thread.currentThread().interrupt();
197 return process.exitValue();
222 process.waitFor(timeOut, units);
223 if (process.isAlive() && terminator.shouldTerminateProcess()) {
227 }
catch (InterruptedException exx) {
228 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", command));
231 }
while (process.isAlive());
232 }
catch (InterruptedException ex) {
233 if (process.isAlive()) {
238 }
catch (InterruptedException exx) {
239 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", command));
242 Thread.currentThread().interrupt();
244 return process.exitValue();
253 if (process == null) {
260 List<Win32Process> children = parentProcess.
getChildren();
262 children.stream().forEach((child) -> {
267 process.destroyForcibly();
269 }
catch (Exception ex) {
270 logger.log(Level.WARNING,
"Error occurred when attempting to kill process: {0}", ex.getMessage());
292 public synchronized String
execute(
final String aCommand,
final String... params) throws IOException, InterruptedException {
294 String[] arrayCommand =
new String[params.length + 1];
295 arrayCommand[0] = aCommand;
297 StringBuilder arrayCommandToLog =
new StringBuilder();
298 arrayCommandToLog.append(aCommand).append(
" ");
300 for (
int i = 1; i < arrayCommand.length; i++) {
301 arrayCommand[i] = params[i - 1];
302 arrayCommandToLog.append(arrayCommand[i]).append(
" ");
305 final Runtime rt = Runtime.getRuntime();
306 logger.log(Level.INFO,
"Executing {0}", arrayCommandToLog.toString());
308 proc = rt.exec(arrayCommand);
319 this.exitValue = proc.waitFor();
339 public synchronized void execute(
final Writer stdoutWriter,
final String aCommand,
final String... params) throws IOException, InterruptedException {
342 String[] arrayCommand =
new String[params.length + 1];
343 arrayCommand[0] = aCommand;
345 StringBuilder arrayCommandToLog =
new StringBuilder();
346 arrayCommandToLog.append(aCommand).append(
" ");
348 for (
int i = 1; i < arrayCommand.length; i++) {
349 arrayCommand[i] = params[i - 1];
350 arrayCommandToLog.append(arrayCommand[i]).append(
" ");
353 final Runtime rt = Runtime.getRuntime();
354 logger.log(Level.INFO,
"Executing {0}", arrayCommandToLog.toString());
356 proc = rt.exec(arrayCommand);
367 this.exitValue = proc.waitFor();
368 logger.log(Level.INFO,
"{0} exit value: {1}",
new Object[]{aCommand, exitValue});
382 public synchronized void stop() {
425 private final InputStream
is;
426 private final StringBuffer
output =
new StringBuffer();
427 private volatile boolean doRun =
false;
442 final String SEP = System.getProperty(
"line.separator");
443 InputStreamReader isr;
444 BufferedReader br = null;
446 isr =
new InputStreamReader(this.is);
447 br =
new BufferedReader(isr);
449 while (doRun && (line = br.readLine()) != null) {
450 this.output.append(line).append(SEP);
452 }
catch (
final IOException ex) {
453 logger.log(Level.WARNING,
"Error redirecting stream to string buffer", ex);
458 }
catch (IOException ex) {
459 logger.log(Level.SEVERE,
"Error closing stream reader", ex);
480 return this.output.toString();
495 private final InputStream
is;
496 private volatile boolean doRun =
false;
513 final String SEP = System.getProperty(
"line.separator");
514 InputStreamReader isr;
515 BufferedReader br = null;
517 isr =
new InputStreamReader(this.is);
518 br =
new BufferedReader(isr);
520 while (doRun && (line = br.readLine()) != null) {
521 writer.append(line).append(SEP);
523 }
catch (
final IOException ex) {
524 logger.log(Level.SEVERE,
"Error reading output and writing to file writer", ex);
534 }
catch (IOException ex) {
535 logger.log(Level.SEVERE,
"Error flushing file writer", ex);
ExecUtil.StreamToStringRedirect errorStringRedirect
final long startTimeInSeconds
static int execute(ProcessBuilder processBuilder, ProcessTerminator terminator)
final long maxRunTimeInSeconds
static int waitForTermination(String command, Process process, long timeOut, TimeUnit units, ProcessTerminator terminator)
ExecUtil.StreamToWriterRedirect outputWriterRedirect
static final long DEFAULT_TIMEOUT
static int execute(ProcessBuilder processBuilder)
static int getProcessTimeOutHrs()
static final TimeUnit DEFAULT_TIMEOUT_UNITS
synchronized void execute(final Writer stdoutWriter, final String aCommand, final String...params)
static int waitForTermination(String command, Process process, ProcessTerminator terminator)
TimedProcessTerminator(long maxRunTimeInSeconds)
ExecUtil.StreamToStringRedirect outputStringRedirect
static void killProcess(Process process)
List< Win32Process > getChildren()
static boolean getIsTimeOutEnabled()
synchronized int getExitValue()
synchronized static Logger getLogger(String name)
static int execute(ProcessBuilder processBuilder, long timeOut, TimeUnit units, ProcessTerminator terminator)
boolean shouldTerminateProcess()
static final Logger logger
final StringBuffer output
synchronized String execute(final String aCommand, final String...params)
boolean shouldTerminateProcess()
boolean shouldTerminateProcess()