Выполнение и взаимодействие с командами командной строки в C - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать автоматическую систему развертывания, поэтому я могу подойти ко всему неправильно.В основном наши установки состоят из удаления исходного кода (не с помощью git, а домашней оболочки RCS), выполнения команд make, удаления файлов конфигурации, а затем запуска пользовательских сценариев up / down / update, чтобы вернуть серверы в движение.Система представляет собой систему реального времени, поэтому все должно быть запланировано вокруг наших операторов.В нашей среде у нас есть доступ к C, KornShell, FORTRAN, Pascal и Java.

Моя текущая идея - написать что-то, что вы можете выполнять команды командной строки, взаимодействовать с stdin / out и отслеживать коды выхода процесса и его дочерних элементов.Оттуда мы можем настроить конфигурационные файлы, в которых будет указана команда, ее ожидаемый код завершения, если ему потребуется ввод данных пользователем для ожидания времени начала / отсутствия перехода, а также команда возврата.Мой вопрос заключается в том, где я должен начать искать решение этой задачи в C или Java.Я нашел несколько ресурсов, но я не могу отследить дочерние процессы.Есть ли другие способы автоматического развертывания, которые я пропускаю?

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать стандартный ProcessBuilder для этого предложения.

Пример:

public class GNUMakeExecutor {

    private static final String GNU_MAKE = "make";

    public static void main(String[] args) throws Exception {
        File sourceRootDir = new File("/home/dev/project_root");
        String makeFileName = "MyCustomMakeFile";
        List<String> command = new ArrayList<>();
        command.add(GNU_MAKE);
        // and add/check some flag to skip, in case of pre-compiled headers
        if( Runtime.getRuntime().availableProcessors() > 1 ) {
            command.add("-j"+Runtime.getRuntime().availableProcessors());
        }
        if(null != makeFileName && makeFileName.length() > 0) {
            command.add("-f");
            command.add(makeFileName);
        }
        String path = System.getenv("PATH") + File.pathSeparator +  "/opt/my_additional_util/bin";
        ProcessBuilder pb = new ProcessBuilder().directory(sourceRootDir)
                .command(command).redirectError(Redirect.INHERIT).redirectOutput(Redirect.INHERIT);
        pb.environment().put("PATH", path);
        Process makeProcess = pb.start();
        int exitCode = makeProcess.waitFor();
        if(exitCode != 0)
            System.err.println("Build failed, exit code: " + exitCode );
        else
            System.out.println("Build success");
    }

}

И в то же время вы можете использовать множество зависимых задач, используя Дженкинс .Т.е. сначала создайте C-проект, используя make / cmake и т. Д., А затем выполните bash / docker / cheef / maven / и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...