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();
206 if (process == null) {
213 List<Win32Process> children = parentProcess.
getChildren();
215 children.stream().forEach((child) -> {
220 process.destroyForcibly();
222 }
catch (Exception ex) {
223 logger.log(Level.WARNING,
"Error occurred when attempting to kill process: {0}", ex.getMessage());
245 public synchronized String
execute(
final String aCommand,
final String... params) throws IOException, InterruptedException {
247 String[] arrayCommand =
new String[params.length + 1];
248 arrayCommand[0] = aCommand;
250 StringBuilder arrayCommandToLog =
new StringBuilder();
251 arrayCommandToLog.append(aCommand).append(
" ");
253 for (
int i = 1; i < arrayCommand.length; i++) {
254 arrayCommand[i] = params[i - 1];
255 arrayCommandToLog.append(arrayCommand[i]).append(
" ");
258 final Runtime rt = Runtime.getRuntime();
259 logger.log(Level.INFO,
"Executing {0}", arrayCommandToLog.toString());
261 proc = rt.exec(arrayCommand);
272 this.exitValue = proc.waitFor();
292 public synchronized void execute(
final Writer stdoutWriter,
final String aCommand,
final String... params) throws IOException, InterruptedException {
295 String[] arrayCommand =
new String[params.length + 1];
296 arrayCommand[0] = aCommand;
298 StringBuilder arrayCommandToLog =
new StringBuilder();
299 arrayCommandToLog.append(aCommand).append(
" ");
301 for (
int i = 1; i < arrayCommand.length; i++) {
302 arrayCommand[i] = params[i - 1];
303 arrayCommandToLog.append(arrayCommand[i]).append(
" ");
306 final Runtime rt = Runtime.getRuntime();
307 logger.log(Level.INFO,
"Executing {0}", arrayCommandToLog.toString());
309 proc = rt.exec(arrayCommand);
320 this.exitValue = proc.waitFor();
321 logger.log(Level.INFO,
"{0} exit value: {1}",
new Object[]{aCommand, exitValue});
335 public synchronized void stop() {
378 private final InputStream
is;
379 private final StringBuffer
output =
new StringBuffer();
380 private volatile boolean doRun =
false;
395 final String SEP = System.getProperty(
"line.separator");
396 InputStreamReader isr;
397 BufferedReader br = null;
399 isr =
new InputStreamReader(this.is);
400 br =
new BufferedReader(isr);
402 while (doRun && (line = br.readLine()) != null) {
403 this.output.append(line).append(SEP);
405 }
catch (
final IOException ex) {
406 logger.log(Level.WARNING,
"Error redirecting stream to string buffer", ex);
411 }
catch (IOException ex) {
412 logger.log(Level.SEVERE,
"Error closing stream reader", ex);
433 return this.output.toString();
448 private final InputStream
is;
449 private volatile boolean doRun =
false;
466 final String SEP = System.getProperty(
"line.separator");
467 InputStreamReader isr;
468 BufferedReader br = null;
470 isr =
new InputStreamReader(this.is);
471 br =
new BufferedReader(isr);
473 while (doRun && (line = br.readLine()) != null) {
474 writer.append(line).append(SEP);
476 }
catch (
final IOException ex) {
477 logger.log(Level.SEVERE,
"Error reading output and writing to file writer", ex);
487 }
catch (IOException ex) {
488 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
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)
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()