java调用shell脚本_Java 执行Shell脚本指令
一、介绍
有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRuntime()给我们提供了以下几种exec()方法:
Process exec(String command)
在单独的进程中执行指定的字符串命令。
Process exec(String[] cmdarray)
在单独的进程中执行指定命令和变量。
Process exec(String[] cmdarray, String[] envp)
在指定环境的独立进程中执行指定命令和变量。
Process exec(String[] cmdarray, String[] envp, File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量。
Process exec(String command, String[] envp)
在指定环境的单独进程中执行指定的字符串命令。
Process exec(String command, String[] envp, File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令。
其中,其实cmdarray和command差不多,同时如果参数中如果没有envp参数或设为null,表示调用命令将在当前程序执行的环境中执行;如果没有dir参数或设为null,表示调用命令将在当前程序执行的目录中执行,因此调用到其他目录中的文件和脚本最好使用绝对路径。各个参数的含义:
cmdarray: 包含所调用命令及其参数的数组。
command: 一条指定的系统命令。
envp: 字符串数组,其中每个元素的环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为 null。
dir: 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。
细心的读者会发现,为了执行调用操作,JVM会启一个Process,所以我们可以通过调用Process类的以下方法,得知调用操作是否正确执行:
abstract intwaitFor()
导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
二、调用Shell脚本
1、获取键盘输入
BufferedReader reader = null;try{
reader= new BufferedReader(newInputStreamReader(System.in));
System.out.println("请输入IP:");
String ip= reader.readLine();
上述指令基本很常见:
1、创建读入器:BufferReader
2、将数据流载入BufferReader,即InputStreamReader
3、将系统输入载入InputStreamReader中
4、然后利用reader获取数据。
2、构建指令
shell运行脚本指令为 sh **.sh args,其实这个格式与java格式相同。
我的脚本为:
#!/bin/sh
#根据进程名杀死进程
echo "This is a $call"
if [ $# -lt 2 ]
then
echo "缺少参数:procedure_name和ip"
exit 1
fi
echo "Kill the $1 process"
PROCESS=`ps -ef|grep $1|grep $2|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
echo "Kill the $1 process [ $i ]"
done
其实所有准备若当,就是无法读取里面的数据,执行shell指令,原因就是:
注意事项:
1.shell脚本必须有执行权限,比如部署后chmod -R 777 /webapps
2.shell文件,必须是UNIX格式,ANSI编码格式,否则容易出问题(可以用notepad++,编辑->文档格式转换,格式->转为ANSI格式(UNIX格式)
3、java程序
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;/***@author:dongbl
*@version:
* @Description:
* @date :9:19 2017/11/14*/
public classTestBash {public static voidmain(String [] args){
BufferedReader reader= null;try{
reader= new BufferedReader(newInputStreamReader(System.in));
System.out.println("请输入IP:");
String ip=reader.readLine();
String bashCommand= "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " +ip;//String bashCommand = "chmod 777 " + "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" ;//String bashCommand = "kill -9" + ip;
System.out.println(bashCommand);
Runtime runtime=Runtime.getRuntime();
Process pro=runtime.exec(bashCommand);int status =pro.waitFor();if (status != 0)
{
System.out.println("Failed to call shell's command ");
}
BufferedReader br= new BufferedReader(newInputStreamReader(pro.getInputStream()));
StringBuffer strbr= newStringBuffer();
String line;while ((line = br.readLine())!= null)
{
strbr.append(line).append("\n");
}
String result=strbr.toString();
System.out.println(result);
}catch(IOException ec)
{
ec.printStackTrace();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
其中文件路径为绝对路径,这点需要注意。
三、调试心得
在调试shell脚本执行过程中,反了几个错
1、构建指令不对
1、开始指令为:
String bashCommand = "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;
程序报错,权限不足。
2、此时修改为:
String bashCommand = "chmod 777 "+"/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh "+ " ffmpeg " + ip;
记住一定注意空格(格式)但此时依然无法指定脚本指令。3、在发现格式不对后,修改后,还是不行,此时指令为:
String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip;
2、文件格式不对
这是无法读取内容的关键原因,因为sh文件是在Windows系统下生成的,所以需要将格式修改为linux格式的,即(UNIX格式)
此时网上程序可以了,然后看到指令不同,修改指令即可以了。
最后终于调通了,看来格式经验不足啊
四、参考文献
java调用shell脚本_Java 执行Shell脚本指令相关推荐
- java sql脚本_java执行sql脚本
package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Con ...
- java sql脚本_Java 执行 SQL 脚本文件
是拷贝的别人的,以备学习 package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import ...
- mongo shell连接到mongoDB及shell提示符下执行js脚本
同mysql数据库类似,mongoDB也可通过mongo客户端连接到mongod服务器来进行绝大多数日常管理.这个命令行工具就是mongo,在mysql中则是mysql.通过mongo命令可以连接到本 ...
- Tcl/Tk脚本中执行Shell脚本
在Tcl/Tk脚本中执行Shell命令 set n 0 set x "*"while {$n < 10} {puts $xset x "$x"*set n ...
- python 执行shell命令行效率提升_在python脚本中执行shell命令的方法
使用Python处理一个shell命令或一个执行一个shell脚本,一般情况下,有以下三种方法,以下我们来看: 第一种方法是使用os.system的方法 os.system(" cmd&qu ...
- Linux qt shell脚本,QT执行shell脚本或者执行linux指令
由于我在做linux下的QT开发,有时候会用到shell脚本的辅助,但是需要QT运行shell脚本并获取执行结果,今天给大家分享下我的技巧,废话少说直接上代码: //执行shell指令或者shell脚 ...
- 调用Runtime.getRuntime().exec()执行Linux脚本导致程序挂住的问题分析
问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题. 原因: 先来看Java代码: pu ...
- java groovy脚本_JAVA嵌入Groovy脚本
Java中运行Groovy,有三种比较常用的类支持:GroovyShell,GroovyClassLoader以及Java-Script引擎(JSR-223). GroovyShell: 通常用来运行 ...
- java调用cd传输_Java调用Linux命令(cd的处理)
一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: 1 publicString executeLinuxCmd(String cmd) {2 System.out.pri ...
最新文章
- 线程中消费者生产者的实例代码(使用Lock类)
- eclipse 创建maven web 项目
- kaggle图像比赛中的submission文件格式解析
- iOS开发出错whose view is not in the window hierarchy!的解决
- TCP的三次握手过程与四次挥手
- 判断相等_为什么不建议你用a.equals(b)判断对象相等
- 蓝桥杯 BASIC-8 基础练习 回文数
- 投递简历总是石沉大海?HR表现的机会都不给你?【Python爬虫实战:简历模板采集】
- 恒强系统服务器,恒强系统色码解析大全
- 走遍美国之大雾山国家公园
- UVM设计模式 (三) 静态类、资源管理、uvm_event、uvm_*_pool、uvm_config_db、UVM_REGEX_NO_DPI
- 代码对比工具(beyondCompare/Winmerge/Meld)
- [SP]梦网masterSP模式下的sp生存
- 关于新光源中我想做的事
- 解决多个数独重叠联系
- Tomcat双向SSL认证及CA数字证书安装和配置QQ即时通信协议窥探
- Kubernetes 学习15 kubernetes 认证及serviceaccount
- Vs code快捷键及常用插件
- 聊聊Redis的数据热点问题
- python 关键字field
热门文章
- Java项目:超市购物商城管理系统(java+SSM+JSP+jQuery+Mysql)
- python周期函数_对python周期性定时器的示例详解
- 计算机文化基础在线作业答案,2016春华东石油《计算机文化基础》第一阶段在线作业.doc...
- 进击高手【第十期】树
- google2012招聘
- 谷歌浏览器打不开,点击图标没反应
- 【python爬虫-爬微博】爬取王思聪所有微博数据
- ubuntu安装kali linux工具,Ubuntu安装Kali Linux渗透测试工具
- 我虽不是人类:且看我如何攻破Google的ReCAPTCHA
- 错误纪录3-[UITapGestureRecognizer superview]: unrecognized selector sent to instance