美文网首页
【Java调用Linux】Java调用Linux shell

【Java调用Linux】Java调用Linux shell

作者: 小王爱写BUG | 来源:发表于2020-09-08 13:32 被阅读0次

Java调用Linux shell

package net.zhongfu.updateCP;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.SequenceInputStream;
import java.util.ArrayList;

/**
 * @Author Devin
 * @create 2020/9/8 11:25
 */
public class Update {

    public static String NIFI_HOME;
    public static String NIFI_FLOWXML;
    public static String NIFI_BAK = "/opt/xx-bak";
    public static String SOURCE = "/opt/source/";
    public static String SOURCE_ZIP = "/opt/source*";

    public static void main(String[] args) {
        NIFI_HOME = System.getProperty("NIFI_HOME");
        if (NIFI_HOME == null) {
            NIFI_HOME = "/opt/wzd/xx/";
        }
        NIFI_FLOWXML = NIFI_HOME + "conf/flow.xml.gz";
        new Update().update();
    }

    /**
     * 执行复制、覆盖操作
     */
    public void update() {
        //解压 source.zip
        String unzipCommand = "unzip source.zip";
        executeLinuxCommand(unzipCommand);
        //新建备份的文件夹
        String mkdirDir = "mkdir " + NIFI_BAK;
        executeLinuxCommand(mkdirDir);
        //复制flow.xml.gz文件
        String cpNifiFlowXML = "cp -rf " + NIFI_FLOWXML + " " + NIFI_BAK;
        executeLinuxCommand(cpNifiFlowXML);
        //获取source中,所有的文件夹名
        ArrayList<File> filenameAndDirnameList = getFilenameAndDirname(SOURCE);
        //将 NIFI_HOME 中与 source 中重名的文件夹备份到 NIFI_BARK
        for (File file : filenameAndDirnameList) {
            String dirname = file.getName();
            String cpDirname = "cp -rf " + NIFI_HOME + dirname + " " + NIFI_BAK;
            executeLinuxCommand(cpDirname);
        }
        //更新文件
        traversalFile(SOURCE);
        //删除 source 和 source.zip
        String rmSource = "rm -rf " + SOURCE_ZIP;
        executeLinuxCommand(rmSource);
        System.out.println("更新完成!");

    }

    /**
     * 递归更新文件夹里的文件和目录
     *
     * @param filename
     */
    public void traversalFile(String filename) {
        ArrayList<File> filenameAndDirname = getFilenameAndDirname(filename);
        for (File file : filenameAndDirname) {
            if (file.isDirectory()) {
                String mkdirDir = "cp -rf " + file.getAbsolutePath() + " " + NIFI_HOME;
                executeLinuxCommand(mkdirDir);
                traversalFile(file.getAbsolutePath());
            }else if (file.isFile()) {
                String moveUpdate = "mv -f " + file.getAbsolutePath() + " " + NIFI_HOME + file.getAbsolutePath().replace(SOURCE, "");
                executeLinuxCommand(moveUpdate);
            }
        }
    }

    /**
     * 执行Linux命令方法
     */
    public String executeLinuxCommand(String param) {
        try {
            Process ps = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", param});
            ps.waitFor();
            SequenceInputStream sis = new SequenceInputStream(ps.getInputStream(), ps.getErrorStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(sis, "gbk"));
            StringBuilder out = new StringBuilder();
            byte[] b = new byte[8192];
            for (int n; (n = sis.read(b)) != -1; ) {
                out.append(new String(b, 0, n));
            }
            sis.close();
            ps.destroy();
            return out.toString();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("执行脚本出错");
        }
        return null;
    }

    /**
     * 获取当前目录下所有的文件夹名字
     */
    public ArrayList<File> getFilenameAndDirname(String filename) {
        ArrayList<File> filelist = new ArrayList();
        File file = new File(filename);
        File[] tempList;
        if (file.isDirectory()) {
            tempList = file.listFiles();
            for (int i = 0; i < tempList.length; i++) {
                filelist.add(tempList[i]);
            }
        }
        return filelist;
    }
}

遇到的问题

  • 别名命令调用失败
    alias
  • /*路径解析失败
    cp -rf /opt/* /opt/wzd
    原因是:java -jar 执行 jar 包调用的 shell 与 linux 命令行调用的不是同一个 shell

相关文章

网友评论

      本文标题:【Java调用Linux】Java调用Linux shell

      本文链接:https://www.haomeiwen.com/subject/loleektx.html