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
网友评论