Java: отправка ввода в Process, где Process перенаправляет ввод-вывод - PullRequest
0 голосов
/ 27 апреля 2020

У меня следующая проблема: я хочу создать что-то вроде «оболочки процесса», в которой размещается процесс и отправляется ему команда, если приложение получает сигнал 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

...