Java如何调用shell脚本的

有些时候会碰到这样的场景:java的功能里面要嵌入一个功能点,这个功能是通过是shell脚本实现的。这种时候就需要Java对脚本调用的支持了。

测试环境

Ubuntu16.04 i3-6100,12GB

Hello World

来看一个基本的例子

    Process exec = Runtime.getRuntime().exec(new String[] { "uname" ,"-a"});
    exec.waitFor();
    BufferedReader reader =
            new BufferedReader(new InputStreamReader(exec.getInputStream()));
    System.out.println(reader.readLine());

Linux jason-Inspiron-3650 4.4.0-121-generic #145-Ubuntu SMP Fri Apr 13 13:47:23 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

解读Process

java.lang.Process类提供了获取输入、输出、等待执行和销毁进程的方法。

Process类可通过ProcessBuilder.start() 和 Runtime.exec 创建实例,从Java1.5开始,ProcessBuilder.start()是更推荐的做法,但网上的教程更多推荐用Runtime.exec()方法。

Modifier and Type Method Description
abstract void destroy () Kills the subprocess.
abstract int exitValue () Returns the exit value for the subprocess.
abstract InputStream getErrorStream () Returns the input stream connected to the error output of the subprocess.
abstract InputStream getInputStream () Returns the input stream connected to the normal output of the subprocess.
abstract OutputStream getOutputStream () Returns the output stream connected to the normal input of the subprocess.
abstract int waitFor () Causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.

继承体系上面,Process的实现类是JDK内置的,linux版本的jdk中只带有一个实现类UnixProcess。

与脚本交互

Process不但可以执行进程,还可以获取进程的返回结果。

    private String executeCommand(String command) {
        StringBuffer output = new StringBuffer();
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            int exitCode = p.waitFor();
            System.out.println(exitCode);
            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = "";
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(output.toString());
        return output.toString();
    }

PING www.a.shifen.com (111.13.100.91) 56(84) bytes of data.
64 bytes from localhost (111.13.100.91): icmp_seq=1 ttl=52 time=7.66 ms
64 bytes from localhost (111.13.100.91): icmp_seq=2 ttl=52 time=7.90 ms
64 bytes from localhost (111.13.100.91): icmp_seq=3 ttl=52 time=14.0 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 7.668/9.861/14.013/2.937 ms

总结

Java 执行脚本的方式其实类似用直接在bash里面执行脚本,区别在于环境有些变动,执行的效果和bash基本一致。

本文发布于微信公众号:可乐小数据(xiaokele_data)。

原文地址:https://www.cnblogs.com/jason0529/p/9011703.html

时间: 2024-10-22 10:57:04

Java如何调用shell脚本的的相关文章

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

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

利用jmeter发起java请求调用shell脚本

1.创建maven项目 在pom文件中加入依赖: 2.在路径src/main/java下创建类,如类名shellclass 3.      创建jmeter调用类,如jmtershell,完成jmetershell编写后导出成jar包. 3.     将shelljmeter.jar放入jmeter安装路径\lib\ext目录下:将依赖的maven包ganymed-ssh2-210-huson-1.jar放入jmeter安装路径\lib路径下. 4.         在jmeter中创建java

java调用shell脚本且传递参数

在最近的工作中,需要用到Java要调用shell脚本的情况.总结如下: @RequestMapping("/changePermission") public String changePermission(){ String returnCode = ""; try { Process process = Runtime.getRuntime().exec("chmod 755 /tmp/upgrade.sh"); process.waitFo

Java 调用 shell 脚本详解

这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的"陷阱"造成调用shell 脚本在某些特殊的场景下,有一些奇奇怪怪的bug. 大家且听我一一道来. 先看看网上搜索到的例子: [java] view plain copy package someTest; import java.io.BufferedReader; import java.io.IOException; im

Java调用 shell脚本阻塞

Java在调用Shell时,要不断读取进程中标准输出和错误输出流的信息,否则缓冲区被写满就会造成子进程阻塞而无法继续运行下去,可起两个线程不断读取标准输出.错误流信息而不被阻塞 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingExcept

JAVA远程执行Shell脚本类

1.java远程执行shell脚本类 1 package com.test.common.utility; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.nio.charset.Charset; 7 8 import org.apache.commons.io.IOUtils; 9 import o

基于sparksql调用shell脚本运行SQL

[Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e  , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # upload logs to hdfs yesterday=`date --date='1 days ago' +%Y%m%d` /opt/modules/spark/bin/spark-sql -i /opt/bin/spark_opt/init.sql --master spark://10.130.2

[Shell]crontab 执行任务调用shell脚本,相对路径无法找到

问题出现的场景大概就是 1  cron调用一个python脚本 2  python脚本中调用一个shell脚本(对日志分析)获取shell输出然后发送邮件 类似一个监控任务. 直接执行python脚本没有问题,但是写在cron中之后,shell脚本中的相对路径就找不到了,总是提示无法找到某些文件 后来解决的问题就是使用log文件的绝对路径,运行就正常了. google了一些,发现很多人也遇到过类似的问题,可能和cron的机制有关系. 大部分人的问题都是因为环境变量造成的,因为cron是一个独立进

crontab 调用shell 脚本不运行

最近用crontab 调用一个shell 脚本,并且shell脚本里面调用一个python脚本 其实就是嫌弃python 写一个判断麻烦,就用shell 写了一个if判断 为真的情况下 运行这个python脚本. 但是部署以后 直接sh test.sh 脚本运行没有问题,但是放到crontab中死活就是不运行 在此记录下原因 原因一:shell脚本中调用了一个命令  ip addr |egrep  这种情况下,ip这个名声是在/sbin下,但是crontab 调用的环境变量目录是 /bin  所