相关参考内容原文地址:

bldong:Java 执行Shell脚本指令


1、介绍

在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRuntime()给我们提供了以下几种exec()方法:

  1. Process exec(String command)
  2. 在单独的进程中执行指定的字符串命令。
  3. Process exec(String[] cmdarray)
  4. 在单独的进程中执行指定命令和变量。
  5. Process exec(String[] cmdarray, String[] envp)
  6. 在指定环境的独立进程中执行指定命令和变量。
  7. Process exec(String[] cmdarray, String[] envp, File dir)
  8. 在指定环境和工作目录的独立进程中执行指定的命令和变量。
  9. Process exec(String command, String[] envp)
  10. 在指定环境的单独进程中执行指定的字符串命令。
  11. Process exec(String command, String[] envp, File dir)
  12. 在有指定环境和工作目录的独立进程中执行指定的字符串命令。

如果参数中如果没有envp参数或设为null,表示调用命令将在当前程序执行的环境中执行;如果没有dir参数或设为null,表示调用命令将在当前程序执行的目录中执行,因此调用到其他目录中的文件和脚本最好使用绝对路径。

各个参数的含义:

  1. cmdarray: 包含所调用命令及其参数的数组。
  2. command: 一条指定的系统命令。
  3. envp: 字符串数组,其中每个元素的环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为 null。
  4. dir: 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。

通过调用Process类的以下方法,得知调用操作是否正确执行:

  1. abstract int waitFor()
  2. 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。

2、调用shell脚本

2.1 获取键盘输入

  1. BufferedReader reader = null;
  2. try{
  3. reader = new BufferedReader(new InputStreamReader(System.in));
  4. System.out.println("请输入IP:");
  5. String ip = reader.readLine();

上述指令基本很常见:

  1. 创建读入器:BufferReader
  2. 将数据流载入BufferReader,即InputStreamReader
  3. 将系统输入载入InputStreamReader中
  4. 然后利用reader获取数据。

2.2 构建指令

shell运行脚本指令为 sh **.sh args。

  1. #!/bin/sh
  2. #根据进程名杀死进程
  3. echo "This is a $call"
  4. if [ $# -lt 2 ]
  5. then echo "缺少参数:procedure_name和ip" exit 1
  6. fi
  7. echo "Kill the $1 process"
  8. PROCESS=`ps -ef|grep $1|grep $2|grep -v grep|grep -v PPID|awk '{ print $2}'`
  9. for i in $PROCESS
  10. do echo "Kill the $1 process [ $i ]"
  11. done

注意事项:

  1. shell脚本必须有执行权限,比如部署后chmod -R 777 /webapps
  2. shell文件,必须是UNIX格式,ANSI编码格式,否则容易出问题(可以用notepad++,编辑->文档格式转换,格式->转为ANSI格式(UNIX格式)

2.3 Java代码

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. public class TestBash {
  5. public static void main(String [] args){
  6. BufferedReader reader = null;
  7. try{
  8. reader = new BufferedReader(new InputStreamReader(System.in));
  9. System.out.println("请输入IP:");
  10. String ip = reader.readLine();
  11. String bashCommand = "sh "+ "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" + " ffmpeg " + ip;
  12. // String bashCommand = "chmod 777 " + "/usr/local/java/jdk1.8.0_121/lib/stopffmpeg.sh" ;
  13. // String bashCommand = "kill -9" + ip;
  14. System.out.println(bashCommand);
  15. Runtime runtime = Runtime.getRuntime();
  16. Process pro = runtime.exec(bashCommand);
  17. int status = pro.waitFor();
  18. if (status != 0)
  19. {
  20. System.out.println("Failed to call shell's command ");
  21. }
  22. BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
  23. StringBuffer strbr = new StringBuffer();
  24. String line;
  25. while ((line = br.readLine())!= null)
  26. {
  27. strbr.append(line).append("\n");
  28. }
  29. String result = strbr.toString();
  30. System.out.println(result);
  31. }
  32. catch (IOException ec)
  33. {
  34. ec.printStackTrace();
  35. }
  36. catch (InterruptedException ex){
  37. ex.printStackTrace();
  38. }
  39. }
  40. }

3、Java调用Shell并传入参数

  1. public static void invokeShell(){
  2. //方法1 执行字符串命令(各个参数1234之间需要有空格)
  3. String path="sh /root/zpy/zpy.sh 1 2 3 4";
  4. //方法2 在单独的进程中执行指定命令和变量。
  5. //第一个变量是sh命令,第二个变量是需要执行的脚本路径,从第三个变量开始是我们要传到脚本里的参数。
  6. String[] path=new String[]{"sh","/root/zpy/zpy.sh","1","2","3","4"};
  7. try{
  8. Runtime runtime = Runtime.getRuntime();
  9. Process pro = runtime.exec(path);
  10. int status = pro.waitFor();
  11. if (status != 0)
  12. {
  13. System.out.println("Failed to call shell's command");
  14. }
  15. BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
  16. StringBuffer strbr = new StringBuffer();
  17. String line;
  18. while ((line = br.readLine())!= null)
  19. {
  20. strbr.append(line).append("\n");
  21. }
  22. String result = strbr.toString();
  23. System.out.println(result);
  24. }
  25. catch (IOException ec)
  26. {
  27. ec.printStackTrace();
  28. }
  29. catch (InterruptedException ex){
  30. ex.printStackTrace();
  31. }
  32. }

4、Java调用远程的Shell脚本

  1. <!--调用远程服务器上的shell-->
  2. <dependency>
  3. <groupId>org.jvnet.hudson</groupId>
  4. <artifactId>ganymed-ssh2</artifactId>
  5. <version>build210-hudson-1</version>
  6. </dependency>
  1. /**
  2. * 执行远程服务器上的shell脚本
  3. * @param ip 服务器IP地址
  4. * @param port 端口号
  5. * @param name 登录用户名
  6. * @param pwd 密码
  7. * @param cmds shell命令
  8. */
  9. public static void RemoteInvokeShell(String ip,int port,String name,String pwd,String cmds) {
  10. Connection conn=null;
  11. try {
  12. conn = new Connection(ip,port);
  13. conn.connect();
  14. if (conn.authenticateWithPassword(name, pwd)) {
  15. // Open a new {@link Session} on this connection
  16. Session session = conn.openSession();
  17. // Execute a command on the remote machine.
  18. session.execCommand(cmds);
  19. BufferedReader br = new BufferedReader(new InputStreamReader(session.getStdout()));
  20. BufferedReader brErr = new BufferedReader(new InputStreamReader(session.getStderr()));
  21. String line;
  22. while ((line = br.readLine()) != null) {
  23. logger.info("br={}", line);
  24. }
  25. while ((line = brErr.readLine()) != null) {
  26. logger.info("brErr={}", line);
  27. }
  28. if (null != br) {
  29. br.close();
  30. }
  31. if(null != brErr){
  32. brErr.close();
  33. }
  34. session.waitForCondition(ChannelCondition.EXIT_STATUS, 0);
  35. int ret = session.getExitStatus();
  36. logger.info("getExitStatus:"+ ret);
  37. } else {
  38. logger.info("登录远程机器失败" + ip);
  39. }
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. } finally {
  45. if (conn != null) {
  46. conn.close();
  47. }
  48. }
  49. }
  50. public static void main(String[] args){
  51. RemoteInvokeShell("192.168.11.xx",22,"xx","xx","sh /root/zpy/zpy.sh \"jj|aa|bb\"")//带有特殊符号的参数需要加上双引号
  52. }

Java执行Dos-Shell脚本的更多相关文章

  1. java 调用bash shell脚本阻塞的小问题的解决

    java  调用bash shell脚本阻塞的小问题的解决 背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结 ...

  2. Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

    本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...

  3. top 自动执行的shell脚本中,使用top -n 1 > log.txt, 上电自动执行,文件无输出

    . 自动执行的shell脚本中,使用top -n > log.txt, 上电自动执行,文件无输出,使用一下命令解决: //usr/bin/top -d -n -b > log.txt 如果 ...

  4. 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码传参数 ...

  5. Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务

    本文转载自:https://blog.csdn.net/tototuzuoquan/article/details/73251616 1.Azkaban实战 Azkaba内置的任务类型支持comman ...

  6. Java如何调用shell脚本的

    有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的.这种时候就需要Java对脚本调用的支持了. 测试环境 Ubuntu16.04 i3-6100,12G ...

  7. Linux centos开机执行JAR Shell脚本

    Linux centos开机执行shell脚本 Linux centos开机执行 java  jar 1.编写jar执行脚本 vim start.sh 加入如下内容(根据自己真实路径与数据进行编写) ...

  8. 批量复制及执行命令shell脚本

    平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可 ...

  9. 每秒执行一个shell脚本(转载)

      上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...

  10. [转]如何取得当前正在执行的shell脚本的绝对路径?

    来源:http://sexywp.com/bash-how-to-get-the-basepath-of-current-running-script.htm 如题,一般我们写Shell脚本的时候,都 ...

随机推荐

  1. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...

  2. Service Mesh——微服务中的流量管理中间件

    Service Mesh--微服务中的流量管理中间件 摘自-https://zhuanlan.zhihu.com/p/28794062 Service mesh 与 Cloud Native Kube ...

  3. UNION An Unreferenced Metric for Evaluating Open-ended Story Generation精读

    UNION An Unreferenced Metric for Evaluating Open-ended Story Generation精读 UNION: 一种评估开放故事生成无参考文本依赖me ...

  4. JavaScript--总结三(数组和函数)

    数组 数组的概念: 将多个元素(通常是同一类型)按照一定顺序排列放到一个集合中,这个集合称之为数组---简(一组有序的数据) 数组的作用:可以一次性存储多个数据 数组的定义: 1.通过构造函数创建数组 ...

  5. webservcie学习之webservice平台技术与开发

    webservice平台技术有哪些 XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术. 1.XML+XSD WebService采用HTTP协议传输数据,采用XML格式封装 ...

  6. Mono for android 访问Webservice和WebApi以及获取和解析JSON

    先看效果,注意:(1)这里由于我的模拟器不支持中文输入,所以,对于这张效果图,我是直接在代码中写死了我的查询城市,在下面的代码中我是没有把要查询的城市写死的. (2)读者要想成功使用本示例的所有代码的 ...

  7. 注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现

    文章转自微信公众号:[机器学习炼丹术] 参考目录: 目录 0 概述 1 主要内容 1.1 Non local的优势 1.2 pytorch复现 1.3 代码解读 1.4 论文解读 2 总结 论文名称: ...

  8. Spark Streaming和Kafka整合是如何保证数据零丢失

    转载:https://www.iteblog.com/archives/1591.html 当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢 ...

  9. [Skill] git下载助手

    缘由 某些时候需要下载git项目中的某个独立的文件或者文件夹下的内容,克隆全部速度过于慢 搜索下发现有开源的实现,特此记录下 方案 国内不便于fq 源码 服务地址 国外原作者 源码 服务地址 使用方法 ...

  10. llinux文件相关指令

    一---导读 首先我们来看这样一个小案例,假设张三要出差,按照 这样的路线进行 北京->上海,之后回到北京.再按照北京->天津->石家庄这样的路线进行出差(北京是根据地).假设现在张 ...