一、介绍

有时候我们在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脚本指令相关推荐

  1. java sql脚本_java执行sql脚本

    package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Con ...

  2. java sql脚本_Java 执行 SQL 脚本文件

    是拷贝的别人的,以备学习 package com.unmi.db; import java.io.FileInputStream; import java.io.InputStream; import ...

  3. mongo shell连接到mongoDB及shell提示符下执行js脚本

    同mysql数据库类似,mongoDB也可通过mongo客户端连接到mongod服务器来进行绝大多数日常管理.这个命令行工具就是mongo,在mysql中则是mysql.通过mongo命令可以连接到本 ...

  4. Tcl/Tk脚本中执行Shell脚本

    在Tcl/Tk脚本中执行Shell命令 set n 0 set x "*"while {$n < 10} {puts $xset x "$x"*set n ...

  5. python 执行shell命令行效率提升_在python脚本中执行shell命令的方法

    使用Python处理一个shell命令或一个执行一个shell脚本,一般情况下,有以下三种方法,以下我们来看: 第一种方法是使用os.system的方法 os.system(" cmd&qu ...

  6. Linux qt shell脚本,QT执行shell脚本或者执行linux指令

    由于我在做linux下的QT开发,有时候会用到shell脚本的辅助,但是需要QT运行shell脚本并获取执行结果,今天给大家分享下我的技巧,废话少说直接上代码: //执行shell指令或者shell脚 ...

  7. 调用Runtime.getRuntime().exec()执行Linux脚本导致程序挂住的问题分析

    问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题. 原因: 先来看Java代码: pu ...

  8. java groovy脚本_JAVA嵌入Groovy脚本

    Java中运行Groovy,有三种比较常用的类支持:GroovyShell,GroovyClassLoader以及Java-Script引擎(JSR-223). GroovyShell: 通常用来运行 ...

  9. java调用cd传输_Java调用Linux命令(cd的处理)

    一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: 1 publicString executeLinuxCmd(String cmd) {2 System.out.pri ...

最新文章

  1. 线程中消费者生产者的实例代码(使用Lock类)
  2. eclipse 创建maven web 项目
  3. kaggle图像比赛中的submission文件格式解析
  4. iOS开发出错whose view is not in the window hierarchy!的解决
  5. TCP的三次握手过程与四次挥手
  6. 判断相等_为什么不建议你用a.equals(b)判断对象相等
  7. 蓝桥杯 BASIC-8 基础练习 回文数
  8. 投递简历总是石沉大海?HR表现的机会都不给你?【Python爬虫实战:简历模板采集】
  9. 恒强系统服务器,恒强系统色码解析大全
  10. 走遍美国之大雾山国家公园
  11. UVM设计模式 (三) 静态类、资源管理、uvm_event、uvm_*_pool、uvm_config_db、UVM_REGEX_NO_DPI
  12. 代码对比工具(beyondCompare/Winmerge/Meld)
  13. [SP]梦网masterSP模式下的sp生存
  14. 关于新光源中我想做的事
  15. 解决多个数独重叠联系
  16. Tomcat双向SSL认证及CA数字证书安装和配置QQ即时通信协议窥探
  17. Kubernetes 学习15 kubernetes 认证及serviceaccount
  18. Vs code快捷键及常用插件
  19. 聊聊Redis的数据热点问题
  20. python 关键字field

热门文章

  1. Java项目:超市购物商城管理系统(java+SSM+JSP+jQuery+Mysql)
  2. python周期函数_对python周期性定时器的示例详解
  3. 计算机文化基础在线作业答案,2016春华东石油《计算机文化基础》第一阶段在线作业.doc...
  4. 进击高手【第十期】树
  5. google2012招聘
  6. 谷歌浏览器打不开,点击图标没反应
  7. 【python爬虫-爬微博】爬取王思聪所有微博数据
  8. ubuntu安装kali linux工具,Ubuntu安装Kali Linux渗透测试工具
  9. 我虽不是人类:且看我如何攻破Google的ReCAPTCHA
  10. 错误纪录3-[UITapGestureRecognizer superview]: unrecognized selector sent to instance