由Java代码运行shell命令/脚本
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代码运行shell命令/脚本的更多相关文章
- 【Hadoop离线基础总结】通过Java代码执行Shell命令
通过Java代码执行Shell命令 需求 在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面 ...
- PHP——运行shell命令|脚本
内置函数 PHP | 系统程序执行 exec shell_exec passthru system 配置 打开php.ini配置文件,并从disable_function将用到的函数从禁用中删除,然后 ...
- Linux系统下python代码运行shell命令的方法
方法一:os.popen #!/usr/bin/python # -*- coding: UTF-8 -*- import os, sys # 使用 mkdir 命令 a = 'ls' b = os. ...
- 在R中运行Shell命令脚本(Call shell commands from R)
aaa.R Args <- commandArgs()cat("Args[1]=",Args[1],"\n")cat("Args[2]=&quo ...
- java运行shell命令,chmod 777 xxx,改变权限无效的解决的方法。
在java程序中运行shell命令,改变文件的权限.能够在命令行中运行 chmod 777 <span style="font-family: Arial, Helvetica, sa ...
- Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件
本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...
- 4.Vim编辑器与Shell命令脚本
第4章 Vim编辑器与Shell命令脚本 章节简述: 本章首先讲解如何使用Vim编辑器来编写.修改文档,然后通过逐个配置主机名称.系统网卡以及Yum软件仓库参数文件等实验,帮助读者加深Vim编辑器中诸 ...
- 《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本
<Linux就该这么学>培训笔记_ch04_Vim编辑器与Shell命令脚本 文章最后会post上书本的笔记照片. 文章主要内容: Vim编辑器 Shell脚本 流程控制语句 if语句 f ...
- 让你提前认识软件开发(23):怎样在C语言中运行shell命令?
第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...
随机推荐
- spring整合flex
在常规的开发中只是用flex二不和后台交互是不可能的,为此flex也提供了和后台交互的2种解决方案一种是Data Services另一种是BlazeDs,本篇博客是用的是后一种,我的开发步骤如下: 1 ...
- JS脚本加载与执行对性能的影响
高性能JavaScript-JS脚本加载与执行对性能的影响 在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 ...
- 关于mysql主从复制的概述与分类(转)
一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------- ...
- android笔记6——intent的使用
今天挑出一节专门来说一下使用intent和intentfilter进行通信. 场景:一个Activity启动还有一个Activity. 前面已经讲了Fragment的切换,Fragment顾名思义是基 ...
- 解决Ubuntu和Windows该文件乱码问题
1.转换文件内容编码 Windows在自然纯文本文件.当中国作为编码GBK,在Ubuntu下乱码,可以使用iconv命令转换: iconv -f gbk -t utf8 source_fi ...
- Iphone CodeSign error: no provisioning profile at path 错
今天在退房手续,变化了profile,当再次进行整理编译项目时.就出现了这个问题,在xCode 6 开发环境下出现了, 出现这个错误提示Code Sign error: Provisioning pr ...
- 使用MySQL Workbench建立数据库,建立新的表,向表中添加数据
使用MySQL Workbench建立数据库,建立新的表,向表中添加数据 初学数据库,记录一下所学的知识.我用的MySQL数据库,使用MySQL Workbench管理.下面简单介绍一下如何使用MyS ...
- Swift学习资料
http://www.hangge.com/blog/cache/category_72_1.html
- 同台交换机同样VLAN能够通信,不同VLAN不可通信
一.示意图 二.IP规划 PC0:192.168.0.100 255.255.255.0 PC1:192.168.0.110 255.255.255.0 PC2:192 ...
- STL源代码剖析(一) - 内存分配
Allocaor allocator 指的是空间配置器,用于分配内存.STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好.SGI STL也定义有一个符 ...