由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上, ...
随机推荐
- 编辑简单的 shell程序
编辑简单的 shell程序 知道了vi编辑器的使用规则之后,结合shell的使用规则,可以编辑简单的 shell程序试试手 题目如下: 1.用while语句创建一个根据输入的数值求累加和(1+2+3+ ...
- shell split分析日志文件
在处理的文件comment有如下格式: ............................ xxx.xxx.10.59 db1059 mynbdpdatadb.idc4. dbname R620 ...
- ESFramework 开发手册(07) -- 掉线与心跳机制(转)
虽然我们前面已经介绍完了ESFramework开发所需掌握的各种基础设施,但是还不够.想要更好地利用ESFramework这一利器,有些背景知识是我们必须要理解的.就像本文介绍的心跳机制,在严峻的In ...
- python常用类型的内置函数列表
1.list.append(obj) 向列表中加入一个对象obj fruits = ['apple', 'pear', 'orange'] >>> fruits.ap ...
- wpf做的3d滑动gallery
原文:wpf做的3d滑动gallery wpf做的3d滑动gallery 随着iphone\ipad的流行及热捧,现在做移动产品不管是什么平台的,领导总想做成像ios系统的样子.自从微软发布了wind ...
- 非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开 ...
- Linux下关于解决JavaSwing中文乱码的情况(转)
前两天在linux中运行java 老是出乱码,很苦恼,后来网上找了好多解决办法.有些可行,有些不可行,今天总结一下. redhed 貌似没出现乱码 本身就jdk就支持中文 红旗linux suse等 ...
- sizeClass和autolayout学习资源整理
sizeClass和autolayout,看来不得不開始放弃frame的写法,收集点资料集中学习下 Adaptivity User Interfaces苹果官方文档:https://developer ...
- 移动web:转盘抽奖(幸运大转盘)
为了获取客户.回馈客户,平台一般会推出抽奖活动类的营销页.因此web页面中,有各式各样的抽奖效果. 格子式(九宫格),背景滚动式(数字/文字/图案),旋转式(转盘),游戏式(砸蛋/拼图...).... ...
- 安装Microsoft .NET Framework 3.5 Service Pack 1回报1603错
server升级了一下系统补丁(360安装),所有发现.net无法打开网站,提示" 因为无法创建应用程序域,因此未能运行请求.错误: 0x80070002 系统找不到指定的文件. " ...