У меня следующая проблема: я хочу создать что-то вроде «оболочки процесса», в которой размещается процесс и отправляется ему команда, если приложение получает сигнал TERM. Для этого я хочу перенаправить ввод и вывод процесса в основное приложение. Я делаю это с ProcessBuilder.inheritIO()
, и это сработало хорошо. Но я не знаю, как отправить команду сейчас, если приложение получает сигнал TERM. OutputStream этого процесса, когда я использую ProcessBuilder.inheritIO()
закрыт, и я получу исключение, если я что-то напишу в него.
Вот мой полный код. Я надеюсь, что вы можете помочь мне.
public static void main(String[] args) throws IOException {
OptionParser optionParser = new OptionParser();
optionParser.accepts("help", "Show the help");
optionParser.accepts("execute", "The command to execute").withRequiredArg();
optionParser.accepts("directory", "The execute directory").withOptionalArg();
optionParser.accepts("shutdown-command", "The shutdown command sent to the process").withRequiredArg();
OptionSet optionSet = optionParser.parse(args);
if (optionSet.has("help")) {
optionParser.printHelpOn(System.out);
return;
}
if (!optionSet.has("execute") || !optionSet.has("shutdown-command")) {
System.out.println("Please enter the correct arguments.");
System.out.println("Example: DockerProcessWrapper.jar --execute <command> --shutdown-command <shutdown-command> (--directory <directory>)");
System.out.println("Use --help for help.");
}
String commandString = (String) optionSet.valueOf("execute");
List<String> command = new ArrayList<>();
if (commandString.contains(" ")) {
command.addAll(Arrays.asList(commandString.split(" ")));
} else {
command.add(commandString);
}
Process process;
ProcessBuilder processBuilder = new ProcessBuilder().inheritIO().command(command);
if (optionSet.has("directory")) {
processBuilder.directory(new File((String) optionSet.valueOf("directory")));
}
process = processBuilder.start();
Signal.handle(new Signal("TERM"), signal -> {
try {
process.getOutputStream().write((optionSet.valueOf("shutdown-command") + "\n").getBytes());
process.getOutputStream().flush();
process.waitFor();
} catch (IOException | InterruptedException exception) {
exception.printStackTrace();
}
});
}
С уважением, Домини c