3

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);
4

2 回答 2

2

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

于 2013-10-07T04:01:23.707 回答
0

正如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()方法。要查看外部进程返回的值,我们使用exitValue()上的方法。在我们的第一个示例中,我们将尝试执行 Java 编译器 (javac.exe): Process

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; 这就是这个程序失败的原因。
这是我使用的最佳链接。查看所有四页。

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

一些链接

  1. 如果您正在运行代码,JSP本文所述
  2. Tomcat 作为窗口服务启动时的 Runtime.exec 问题
于 2013-10-07T06:59:32.710 回答