Java Runtime.exec()在Tomcat上无法工作

3

Runtime.exec() 在 tomcat 上没有工作。

我在运行 Java Web 应用程序时遇到了问题。我使用了 runtime.exec()。它在 Eclipse 中运行得很好。但是在部署到 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所在的服务器上执行某些操作吗?还是在浏览器所在的客户端上执行(这是行不通的)? - Thilo
2个回答

2
如果你想在Runtime.exec()中执行代码,那么它不会在客户端生效。

我在服务器端使用了它。 - Hlaing Myo

0

正如java初学者所回答的那样,我想在这个话题上分享更多的内容。
您没有提到您正在尝试运行哪个命令和错误?希望这可以帮助您。
有几个原因。

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

  1. public Process exec(String command);
  2. public Process exec(String [] cmdArray);
  3. public Process exec(String command, String [] envp);
  4. public Process exec(String [] cmdArray, String [] envp);

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

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

  1. 表示要执行的程序和任何参数的单个字符串
  2. 一个字符串数组,用于分离程序和其参数
  3. 一个环境变量数组

Runtime.exec() 相关的第一个陷阱是 IllegalThreadStateException
API 的主要测试是编写其最明显的方法。例如,要执行一个外部于 Java VM 的进程,我们使用 exec() 方法。要查看外部进程返回的值,我们在 Process 上使用 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 异常;这就是为什么此程序失败的原因。
这是我使用过的最好的链接。查看所有四个页面。

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

一些链接

  1. 如果您正在像这篇文章中提到的那样在 JSP 中运行代码
  2. Tomcat 作为 Windows 服务启动时 Runtime.exec 的问题

@HlaingMyo:你有拼写错误String l_Time = = pData.getTimeStamp();,应该是 String l_Time = pData.getTimeStamp(); - Aniket Kulkarni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接