由Java代码运行shell命令/脚本
2023-09-14 09:10:18 时间
JDK有两种方法自带通Runtime.getRuntime().exec()和ProcessBuilder课上做, 后者是JDK1.5引进后,,政府还提出要放弃使用Runtime顺便做。现的时候就是採用ProcessBuilder,apache commons类库也提供了一个exec包专门做这类功能,这次临时没用到。
在编写过程中,遇到几个比較坑的地方:
1、构建ProcessBuilder採用的參数:
建议採用“/bin/bash”. "-c", "your shell"组装一个List。 事实上你一次假设运行多个命令。都能够统一放到那个“your shell”字符串中。
2、运行过程中输出流控制:
在运行过程中,我们肯定须要得到正常的运行结果。也须要知道出错的内容提示。 这时须要将错误输出流重定向到标准输出流,相当于合并在一起输出
3、有些命令是须要环境变量的支持, 这时须要运行evivonment()拷贝系统相关env变量到当前进程上下文中。供命令使用。
4、假设运行过程卡死,须要知道能够kill哪个进程, 所以输出内容中将当前进程ID打印出,便于手动处理。
完整代码例如以下:
public int exeCmd(String shell) throws IOException { int success = 0; StringBuffer sb = new StringBuffer(); BufferedReader br = null; // get name representing the running Java virtual machine. String name = ManagementFactory.getRuntimeMXBean().getName(); String pid = name.split("@")[0]; try { System.out.println("Starting to exec{ " + shell + " }. PID is: " + pid); Process process = null; ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", shell); pb.environment(); pb.redirectErrorStream(true); // merge error stream into standard stream process = pb.start(); if (process != null) { br = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024); process.waitFor(); } else { System.out.println("There is no PID found."); } sb.append("Ending exec right now, the result is:\n"); String line = null; while (br != null && (line = br.readLine()) != null) { sb.append(line).append("\n"); } } catch (Exception ioe) { sb.append("Error occured when exec cmd:\n").append(ioe.getMessage()) .append("\n"); } finally { PrintWriter writer = null; if (br != null) { br.close(); } try { writer = new PrintWriter(System.out); writer.write(sb.toString()); } catch (Exception e) { LOG.error(e.getMessage(), e); } finally { writer.close(); } success = 1; } return success; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。
相关文章
- Java设置全局变量_java如何定义全局变量
- java json对象和json字符串互转的方法_js中对象转字符串的方法
- Mac端最好用的Java开发工具:IntelliJ IDEA 2022.2.1汉化版(win/mac)
- Java进阶:java开源商城系统源码
- 纠结应该先学Python还是Java?看完就有数了
- java启动器_JAVA基础:Java 启动器如何查找类
- 安卓java游戏模拟器_Java手机游戏模拟器
- java官方编译器_JAVA 编译器
- Java遍历json_java处理json数据
- Java将图片Base64编码转换成img图片文件
- 【Java】类的加载过程
- Java面试集锦(一)之秒杀系统设计
- Java 程序控制结构
- 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )
- Java中小学智慧校园电子班牌系统项目源码
- java中可以通过调用ping命令来判断网络是否连接正常详解编程语言
- Java程序员必备知识,《JAVA编程思想》包和访问权限详解编程语言
- Oracle收购Java:瞩目引发的变革(oracle收购java)
- 策略Java运用Redis设计高效的过期策略(redisjava过期)
- 机制Redis Java实现超时机制(redisjava过期)
- 策略处理Redis中Java使用过期策略的有效方法(redisjava过期)
- Java与Oracle的连接方式(java连oracle)
- 如何在Linux系统中指定Java版本(linux指定java)
- 命令深入了解Linux,学会常用Shell命令(linux常用shell)
- 深入认识Java面试与MySQL及其思考(java面试mysql)
- 一步一步学习:Shell脚本执行Linux命令初探(shell脚本执行linux命令)
- 使用Java程序执行Linux指令:实现自动化操作(java执行linux命令)
- Oracle与Java程序融合谱写成功曲(java程序Oracle)
- Java更新提升Oracle软件性能(java更新oracle)
- 异常Java程序捕获Oracle异常从失败中学习(java捕获oracle)
- 命令Shell下执行Redis命令的简单操作(shell执行redis)