summaryrefslogtreecommitdiffstats
path: root/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java')
-rw-r--r--api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java85
1 files changed, 70 insertions, 15 deletions
diff --git a/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java b/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
index ed47336..d5a3b64 100644
--- a/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
+++ b/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
@@ -17,9 +17,22 @@ public abstract class SystemCommandTask extends AbstractTask
private Process process = null;
+ protected int timeoutSeconds = 0;
+
@Override
protected final boolean execute()
{
+ try {
+ return execInternal();
+ } catch ( Exception e ) {
+ log.warn( "Unexpected exception when executing " + getId() + ": " + e.toString() );
+ processStdErrInternal( e.toString() );
+ return processEnded( -3 );
+ }
+ }
+
+ private final boolean execInternal()
+ {
command = initCommandLine();
if ( command == null || command.length == 0 ) {
return processEnded( -1 );
@@ -31,7 +44,13 @@ public abstract class SystemCommandTask extends AbstractTask
try {
// Create process
- process = pb.start();
+ try {
+ process = pb.start();
+ } catch ( Exception e ) {
+ log.warn( "Process of task " + getId() + " died." );
+ processStdErrInternal( e.toString() );
+ return processEnded( -2 );
+ }
final Process p = process;
processStarted();
p.getOutputStream();
@@ -46,10 +65,11 @@ public abstract class SystemCommandTask extends AbstractTask
String line;
while ( ( line = reader.readLine() ) != null ) {
synchronized ( p ) {
- processStdOut( line );
+ processStdOutInternal( line );
}
}
} catch ( Exception e ) {
+ e.printStackTrace();
}
}
} );
@@ -63,10 +83,11 @@ public abstract class SystemCommandTask extends AbstractTask
String line;
while ( ( line = reader.readLine() ) != null ) {
synchronized ( p ) {
- processStdErr( line );
+ processStdErrInternal( line );
}
}
} catch ( Exception e ) {
+ e.printStackTrace();
}
}
} );
@@ -75,7 +96,30 @@ public abstract class SystemCommandTask extends AbstractTask
stderr.start();
// Wait for everything
- process.waitFor();
+ int retval = -1;
+ if ( this.timeoutSeconds <= 0 ) {
+ retval = process.waitFor();
+ } else {
+ int togo = timeoutSeconds * 10;
+ while ( togo-- > 0 ) {
+ try {
+ retval = process.exitValue();
+ break;
+ } catch ( IllegalThreadStateException e1 ) {
+ // Still running....
+ try {
+ Thread.sleep( 100 );
+ } catch ( Exception e2 ) {
+ // Bummer....
+ }
+ }
+ }
+ }
+ try {
+ stdout.join( 500 );
+ stderr.join( 500 );
+ } catch ( Throwable t ) {
+ }
try {
process.getErrorStream().close();
} catch ( Throwable t ) {
@@ -84,22 +128,15 @@ public abstract class SystemCommandTask extends AbstractTask
process.getOutputStream().close();
} catch ( Throwable t ) {
}
- stdout.join( 2000 );
- stderr.join( 2000 );
- return processEnded( process.exitValue() );
+ synchronized ( p ) {
+ return processEnded( retval );
+ }
- } catch ( IOException e ) {
- log.warn( "Process of task " + getId() + " died." );
- processStdErr( e.toString() );
- return processEnded( -2 );
} catch ( InterruptedException e ) {
+ processEnded( -4 );
Thread.currentThread().interrupt();
return false;
- } catch ( Exception e ) {
- log.warn( "Unexpected exception when executing " + getId() + ": " + e.toString() );
- processStdErr( e.toString() );
- return processEnded( -3 );
} finally {
if ( process != null )
process.destroy();
@@ -134,6 +171,24 @@ public abstract class SystemCommandTask extends AbstractTask
return toStdIn( text.getBytes( StandardCharsets.UTF_8 ) );
}
+ private final void processStdOutInternal( String line )
+ {
+ try {
+ processStdOut( line );
+ } catch ( Throwable t ) {
+ log.warn( "processStdOut failed", t );
+ }
+ }
+
+ private final void processStdErrInternal( String line )
+ {
+ try {
+ processStdErr( line );
+ } catch ( Throwable t ) {
+ log.warn( "processStdErr failed", t );
+ }
+ }
+
/**
* Called to get the command line. Each argument should be a separate array
* element. Returning null means the task should not run (as the arguments