`
bzhang
  • 浏览: 255035 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Runtime exec()调用shell脚本

    博客分类:
  • java
阅读更多

有时,我们需要在java程序中调用外部程序,我们可用通过Runtime.exec()调用来完成。

The class java.lang.Runtime features a static method called getRuntime() , which retrieves the current Java Runtime Environment. That is the only way to obtain a reference to the Runtime object. With that reference, you can run external programs by invoking the Runtime class's exec() method. Developers often call this method to launch a browser for displaying a help page in HTML.

exec()有四个重载版本

There are four overloaded versions of the exec() command:

  • public Process exec(String command);
  • public Process exec(String [] cmdArray);
  • public Process exec(String command, String [] envp);
  • public Process exec(String [] cmdArray, String [] envp);

For each of these methods, a command -- and possibly a set of arguments -- is passed to an operating-system-specific function call. This subsequently creates an operating-system-specific process (a running program) with a reference to a Process class returned to the Java VM. The Process class is an abstract class, because a specific subclass of Process exists for each operating system.

You can pass three possible input parameters into these methods:

  1. A single string that represents both the program to execute and any arguments to that program
  2. An array of strings that separate the program from its arguments
  3. An array of environment variables

Pass in the environment variables in the form name=value . If you use the version of exec() with a single string for both the program and its arguments, note that the string is parsed using white space as the delimiter via the StringTokenizer class.

注意事项:

1.  当调用的外部命令中包含重定向(<、>),管道( | ) 命令时,exec(String command)的版本不能正确解析重定向、管道操作符。所以需要使用exec(String [] cmdArray)。

   如, echo "hello world" > /home/admin/newFile.txt

       ls -e | grep java

   需要使用如下的调用方式

       String []cmdArray = new String[]{ "/bin/sh", "-c", "ls -e | grep java"};

             Runtime.getRuntime().exec(cmdArray);

2.  

 

  • 永远要在调用waitFor()方法之前读取数据流
  • 永远要先从标准错误流中读取,然后再读取标准输出流
  • The next version of Savant is going to focus heavily on the stand-alone runtime and support for dialects and plugins. Supporting all that is largely handled by using a simple executor framework I wrote around Java 1.4 and lower’s Runtime.exec method. A few things to keep in mind when using this:

    1. Always read from the streams prior to calling waitFor. Otherwise you could end up waiting forever on Windows and other OS platforms whose I/O buffers can’t store enough from standard out and standard error to ensure the program has finished. These platforms will pause the execution of whatever is running until something reads the buffered content from standard out and standard error. I would imagine all platforms suffer from this, but some platforms have larger buffers than others. Needless to say, always read from the streams first.
    2. Always read from standard error first. I ran across a bug where some OS platforms will always open standard out, but never close it. What this means is that if you read from standard out first and the process only writes to standard error, you’ll hang forever waiting to read. If you read from standard error first, you’ll always be okay on these platforms because the OS seems to shutdown standard error. I think however, that the best way to handle all cases is to check both standard error and standard out for readiness and only read from them if they have something to offer. The downside I could see here is that error isn’t ready, but eventually will be.

    Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

    在exec()后 立即调用waitFor()会导致进程挂起。

    相关文章:

    1. When Runtime.exec() won't 关于Runtime的注意事项

    http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

    分享到:
    评论

    相关推荐

      使用runtime实现linux命令行或shell脚本多次调用

      `Runtime.exec(String command)`方法用于执行单个命令,而如果需要执行包含多个命令的shell脚本,可以使用`Runtime.exec(String[] cmdArray)`,其中cmdArray是一个包含命令及其参数的字符串数组。 下面是一个简单的...

      android系统中调用shell脚本

      在Android系统中,由于安全性和权限的限制,直接调用shell脚本并不像在Linux或Unix环境下那样简单。然而,对于非root用户来说,确实有一些方法可以实现对shell脚本的调用,尤其是在开发和调试过程中。下面我们将深入...

      java调用shell(包含有参数的调用)

      在某些情况下,Java程序需要调用Shell脚本执行特定的操作,比如访问Linux系统命令或者自动化执行一些任务。本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本...

      java调用shell脚本

      Java作为一种跨平台的编程语言,提供了多种方式来调用Shell脚本,实现与操作系统的交互。本文将深入探讨Java如何调用Shell脚本以及相关的知识点。 首先,Java通过Runtime类或ProcessBuilder类可以执行外部程序,...

      java调用Shell脚本.doc

      ### Java调用Shell脚本详解 #### 一、前言 在实际开发过程中,经常会遇到需要结合Java程序与Shell脚本进行操作的情况。通过Java调用Shell脚本不仅可以实现复杂的功能,还可以提高程序的灵活性和扩展性。本文将详细...

      Java调用shell脚本

      首先,Java调用shell脚本主要通过`Runtime`类或`ProcessBuilder`类来实现。`Runtime.getRuntime().exec()`方法允许我们执行系统命令,而`ProcessBuilder`提供了更灵活的命令构建和环境变量设置功能。下面是一个基本...

      java调用shell脚本完美封装

      在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如自动化运维、文件管理等,这时就可能需要用到调用Shell脚本。本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的...

      java调用shell命令.pdf

      在 Java 中,我们可以使用 `Runtime` 类的 `exec()` 方法来调用 Shell 命令。下面是一个简单的示例代码: ```java Process pid = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "ls -l"}); ``` 在这个...

      Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量).docx

      Java中可以通过`java.lang.Runtime`类中的`exec()`方法来执行外部命令,进而调用Shell脚本或Python脚本。以下是一个基本的例子: ```java public String python(String pythonPath, String[] params) { File file ...

      linux下shell脚本实现数据的导出

      本文将深入讲解如何使用shell脚本来实现数据的导出,并结合Java代码进行调用。 首先,让我们分析给出的`backup.sh`脚本: ```bash su - oracle -c " exp cg23/sa tables=exp_table1,exp_table2 file=/home/oracle/...

      JAVA如何调用Shell脚本

      本文主要介绍了JAVA如何调用Shell脚本,提供了一种实用的解决方案,即使用JAVA的Runtime.getRuntime().exec()方法调用Shell脚本。下面将详细介绍该方法的实现过程和注意事项。 为什么需要调用Shell脚本 在实际项目...

      Java调用linux shell脚本的方法

      首先,调用shell脚本的基本过程分为以下几个步骤: 1. **设置脚本执行权限**:在Linux系统中,执行一个文件(如shell脚本)需要有相应的执行权限。在Java中,我们可以通过`Runtime.getRuntime().exec()`方法来执行...

      java调用shell

      本文将深入探讨如何在Java程序中调用Shell脚本,理解其背后的原理,并提供一系列实用代码示例与应用场景。 ### Java调用Shell的基本原理 Java调用Shell主要依赖于`java.lang.Runtime`类中的`exec()`方法。这个方法...

      Java调用shell脚本解决传参和权限问题的方法

      Java调用shell脚本解决传参和权限问题的方法 Java调用shell脚本解决传参和权限问题的方法是指在Java程序中调用shell脚本来执行某些操作,例如执行系统命令、文件操作等。在调用shell脚本时,可能会遇到传参问题和...

      Java 调用 Shell 命令

      2. **调用Shell脚本**:通过Java的`Runtime.getRuntime().exec()`方法来执行Shell命令或脚本。 下面是一个具体的Java类实现示例,用于调用Shell脚本并记录执行日志: ```java import java.io.*; import java.text....

      java调用shell向DataX传参,带where条件,特殊字符

      Java调用Shell脚本执行DataX任务是一种常见的数据迁移或同步操作。DataX是阿里巴巴开源的数据同步工具,它支持多种数据库之间的数据迁移。在实际应用中,我们可能需要根据特定的业务逻辑,如where条件,来定制数据...

      Java调用Shell命令的方法

      总之,Java通过`Runtime.exec()`方法调用Shell命令,实现了与操作系统交互的能力。这种方式在处理系统级任务时非常有用,尤其是在需要执行复杂操作或者利用已有系统工具时。然而,也应当谨慎使用,以防止潜在的安全...

      Java程序去调用并执行shell脚本及问题总结(推荐)

      Java可以通过ProcessBuilder或Runtime的方式来调用shell脚本。 ProcessBuilder是一种比较直观的方法,参数的设置也比较方便。例如: ```java ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, ...

    Global site tag (gtag.js) - Google Analytics