Java执行shell命令
添加依赖
首先使用Spring Boot
开启一个RESTful
项目,额外的加上Apache Commons Exec
的依赖。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
代码实现
这里分两种情况。一个是最简的只关心执行是否成功,也就是code大于0为失败;另一个是需要拿到执行的标准输出和错误的信息。
只关心是否成功
@Service
public class MainService {
public Integer updateBlogFromGit(){
// 1
CommandLine pull = CommandLine.parse("git pull");
// 2
DefaultExecutor executor = new DefaultExecutor();
executor.setWorkingDirectory(new File("/home/ubuntu/blog"));
// 3,省略try_catch
int exitValue = executor.execute(pull);
if (exitValue == 0) {
exitValue = executor.execute(hugo);
}
return exitValue;
}
}
- 准备要运行的shell命令
- 创建执行器,并设置工作目录
- 最后执行命令,返回code
要拿到标准输出和错误的信息
@Service
public class MainService {
public String updateBlogFromGit(){
// 1
CommandLine pull = CommandLine.parse("git pull");
CommandLine hugo = CommandLine.parse("hugo");
// 2
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayOutputStream errorStream = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);
// 3
DefaultExecutor executor = new DefaultExecutor();
executor.setWorkingDirectory(new File("/home/ubuntu/blog"));
executor.setStreamHandler(streamHandler);
// 4
try {
int exitValue = executor.execute(pull);
if (exitValue == 0) {
exitValue = executor.execute(hugo);
}
String result;
if(exitValue==0){
result= outputStream.toString();
} else {
result = errorStream.toString();
}
return result;
} catch (ExecuteException e) {
return errorStream.toString();
} catch (IOException e) {
return e.getMessage();
}
}
}
- 准备要运行的shell命令
- 准备接收标准输出和错误的Stream
- 创建执行器,并设置工作目录,设置StreamHandler
- 最后执行命令(如果执行时出错会返回大于0的整数),返回标准输出或错误信息或报错堆栈信息
收获
技能树:
后端 --> Java --> 工具库 --> Exec --> 使用
后端 --> Java --> 语言基础 --> ByteArrayOutputStream --> 使用