I am executing shell script using DefaultExecutor & CommandLine from Java Program.
For successful execution receiving 0 exit value
but in case of failure or any other exit code (like 127,128,255 etc.) from shell script, not receiving respective exit code instead getting IOException.
int iExitValue = 1;
CommandLine cmd = CommandLine.parse("sh /Users/DpakG/scripts/do_Database_Operations.sh");
DefaultExecutor oDefaultExecutor = new DefaultExecutor();
oDefaultExecutor.setExitValue(0);
try {
iExitValue = oDefaultExecutor.execute(cmd);
log.info("Script Exit Code: " iExitValue);
} catch (IOException e) {
log.error("IOException occurred: ", e);
}
Any Idea How to handle exit code to perform specific custom action?
CodePudding user response:
The documentation for DefaultExecutor::execute() says it throws
ExecuteException - execution of subprocess failed or the subprocess returned a exit value indicating a failure
An ExecuteException is a subclass of IOException, hence it getting caught by your code. If you instead try to (also) catch the correct exception, you can use its getExitValue() method to get the exit status.
int iExitValue = 1;
CommandLine cmd = CommandLine.parse("sh /Users/DpakG/scripts/do_Database_Operations.sh");
DefaultExecutor oDefaultExecutor = new DefaultExecutor();
oDefaultExecutor.setExitValue(0);
try {
iExitValue = oDefaultExecutor.execute(cmd);
log.info("Script succeeded with exit code " iExitValue); // Always successful (0)
} catch (ExecuteException e) {
log.info("Script failed with exit code " e.getExitValue());
} catch (IOException e) {
log.error("IOException occurred: ", e);
}
CodePudding user response:
After exploring more, I am able to figure out right answer.
For Success exit codes, use setExitValues() with int array of success codes instead of 'setExitValue()' with single exit code as integer value.
int[] codes = {0,127,128};
oDefaultExecutor.setExitValues(codes);
Rest of the Failure exit codes would be captured within ExecuteException block
catch (ExecuteException exe) {
iExitValue = exe.getExitValue();
log.info("Script failed with exit code: " iExitValue);
}
Complete code snippet with solution
int iExitValue = 1;
CommandLine cmd = CommandLine.parse("sh /Users/DpakG/scripts/do_Database_Operations.sh");
DefaultExecutor oDefaultExecutor = new DefaultExecutor();
int[] successCodes = {0,127,128};
oDefaultExecutor.setExitValues(successCodes);
try {
iExitValue = oDefaultExecutor.execute(cmd);
log.info("Script succeeded with exit code " iExitValue); // Either 0, 127 or 128
} catch (ExecuteException exe) {
iExitValue = exe.getExitValue();
log.info("Script failed with exit code: " iExitValue);
} catch (IOException ie) {
log.error("IOException occurred: ", ie);
}
