【问题标题】:java runtime.exec() not working on tomcatjava runtime.exec()在tomcat上不起作用
【发布时间】:2013-10-13 13:17:36
【问题描述】:

Runtime.exec() 无法在 tomcat 上运行。

我在从 Java Web 应用程序运行命令时遇到问题。我用runtime.exec()。它在日食时工作正常。但是在部署到tomcat后根本不工作。我认为runtime.exec() 根本不起作用。有什么想法吗?

我是在服务器端写的。我想从运行时创建一个 Windows 计划任务。这是我的代码。

String l_Time = pData.getTimeStamp();
ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start  SchTasks /Create " +
                "/SC WEEKLY /D MON,TUE,WED,THU,FRI,SAT,SUN /TN \"TaskName\"" +
                " /TR \"D:/Test/Test.bat\" /ST 09:00\"");
builder.redirectErrorStream(true);
Process p = builder.start();

BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
    line = r.readLine();
    if (line == null) { break; }
        System.out.println(line);
}
p.waitFor();
int exitVal = p.exitValue();
System.out.println("Process exitValue: " + exitVal);

【问题讨论】:

  • 您是否要在 Tomcat 所在的服务器上执行某些操作?还是在浏览器所在的客户端(不起作用)?

标签: java eclipse tomcat deployment runtime.exec


【解决方案1】:

如果您尝试在 Runtime.exec() 中执行,那么它将无法在客户端运行

【讨论】:

  • 我在服务器端使用过。
【解决方案2】:

正如javaBeginner 的回答,我想就这个话题分享更多内容。
您还没有提到您尝试运行的命令和错误是什么?我希望这对你有帮助。
有几个原因。

java.lang.Runtime 类具有一个名为 getRuntime() 的静态方法,它检索当前的 Java 运行时环境。
exec() 命令有四个重载版本:

  1. 公共进程执行(字符串命令);
  2. 公共进程执行(字符串[] cmdArray);
  3. 公共进程执行(字符串命令,字符串[] envp);
  4. 公共进程执行(字符串[] cmdArray,字符串[] envp);

对于这些方法中的每一个,一个命令(可能还有一组参数)被传递给操作系统特定的函数调用。这随后会创建一个特定于操作系统的进程(一个正在运行的程序),并引用返回给 Java VM 的 Process 类。 Process 类是一个抽象类,因为每个操作系统都存在一个特定的 Process 子类。

您可以将三个可能的输入参数传递给这些方法:

  1. 表示要执行的程序和该程序的任何参数的单个字符串
  2. 将程序与其参数分开的字符串数组
  3. 环境变量数组

Runtime.exec() 相关的第一个陷阱是IllegalThreadStateException
API 普遍的第一个测试是编写其最明显的方法。例如,要执行 Java VM 外部的进程,我们使用 exec() 方法。要查看外部进程返回的值,我们对Process class 使用exitValue() 方法。在我们的第一个示例中,我们将尝试执行 Java 编译器 (javac.exe):

import java.util.*;
import java.io.*;

public class BadExecJavac
{
public static void main(String args[])
{
    try
    {            
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("javac");
        int exitVal = proc.exitValue();
        System.out.println("Process exitValue: " + exitVal);
    } catch (Throwable t)
      {
        t.printStackTrace();
      }
 }
}  

运行 BadExecJavac 会产生:

D:\progs>java BadExecJavac
java.lang.IllegalThreadStateException: process has not exited
    at java.lang.Win32Process.exitValue(Native Method)
    at BadExecJavac.main(BadExecJavac.java:13)  

如果外部进程尚未完成,exitValue() 方法将抛出一个IllegalThreadStateException;这就是这个程序失败的原因。
这是最好的link which I used。查看所有四页。

请记住,在 Web 应用程序 JSP 中,Servlet 在服务器端而不是在客户端运行,Runtime.exec() 在执行命令的同一环境中执行命令。它只会在服务器上运行,而不是在客户端上运行

一些链接

  1. 如果您在JSP 中运行代码,就像post 中提到的那样
  2. Runtime.exec problem with Tomcat when started as Window Service

【讨论】:

  • @HlaingMyo:你有错字String l_Time = = pData.getTimeStamp(); 输入String l_Time = pData.getTimeStamp();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多