在C中执行命令行命令并与之交互

时间:2018-05-24 17:46:54

标签: java c automation

我正在尝试创建一个自动部署系统,所以我可能会接近这一切都错了。基本上我们的安装包括移出源代码(不是使用git,而是使用自己开发的RCS包装器),运行make命令,调整配置文件,然后运行自定义向上/向下/更新脚本以使服务器恢复运行。该系统是一个实时系统,所以必须在我们的运营商周围安排一切。在我们的环境中,我们可以访问C,KornShell,FORTRAN,Pascal和Java。

我目前的想法是写一些你可以执行命令行命令,与stdin / out交互并跟踪进程及其子进程的退出代码。从那里我们可以设置配置文件,说出命令,它的预期退出代码,如果它需要用户输入等待go / no go time以及退出命令。我的问题是我应该从哪里开始用C或Java来完成这项任务。我找到了一些资源,但我似乎无法跟踪子进程。还有其他方法可以进行自动部署吗?

1 个答案:

答案 0 :(得分:0)

您可以使用标准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");
    }

}

同时,您可以使用Jenkins使用一组依赖任务。 即首先使用make / cmake等制作C项目,然后执行一些bash / docker / cheef / maven /等等。

相关问题