Java runtime.exec() не работает на tomcat

Runtime.exec() не работает на коте.

У меня проблема с запуском команды из веб-приложения Java. Я использовал 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);

person Hlaing Myo    schedule 07.10.2013    source источник
comment
Вы пытаетесь выполнить что-то на сервере, где живет Tomcat? или на клиенте, где живет браузер (это не сработает)?   -  person Thilo    schedule 07.10.2013


Ответы (2)


если вы пытаетесь выполнить в Runtime.exec(), то он не будет работать на стороне клиента

person SpringLearner    schedule 07.10.2013
comment
Я использовал на стороне сервера. - person Hlaing Myo; 07.10.2013

Как ответил javaBeginner, я хотел бы поделиться еще кое-чем по этой теме.
Вы не упомянули, какая команда вы пытаетесь запустить и ошибка? Надеюсь, это поможет вам.
На это есть несколько причин.

Функции класса java.lang.Runtime статический метод с именем getRuntime(), который извлекает текущую среду выполнения Java.
Существует четыре перегруженных версии команды exec():

  1. публичный процесс exec (строковая команда);
  2. публичный процесс exec(String [] cmdArray);
  3. public Process exec (команда String, String [] envp);
  4. публичный процесс exec(String [] cmdArray, String [] envp);

Для каждого из этих методов команда и, возможно, набор аргументов передаются вызову функции, специфичной для операционной системы. Впоследствии это создает процесс, специфичный для операционной системы (работающую программу), со ссылкой на класс Process, возвращаемый виртуальной машине Java. Класс Process является абстрактным классом, поскольку для каждой операционной системы существует определенный подкласс Process.

В эти методы можно передать три возможных входных параметра:

  1. Одна строка, представляющая как программу для выполнения, так и любые аргументы этой программы.
  2. Массив строк, отделяющих программу от ее аргументов.
  3. Массив переменных среды

Первая ловушка, связанная с Runtime.exec(), — это IllegalThreadStateException.
Чаще всего первым тестом API является кодирование наиболее очевидных методов. Например, чтобы выполнить процесс, внешний по отношению к виртуальной машине Java, мы используем метод exec(). Чтобы увидеть значение, которое возвращает внешний процесс, мы используем метод exitValue() в Process класс. В нашем первом примере мы попытаемся запустить компилятор 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; вот почему эта программа потерпела неудачу.
Это лучшая ссылка который я использовал. Посмотреть все четыре страницы.

Помните, что в JSP веб-приложения сервлет запускается на стороне сервера, а не на стороне клиента, и Runtime.exec() выполняет команды в той же среде, в которой выполняется команда. Он будет работать только на сервере, а не на клиенте

Некоторые ссылки

  1. Если вы используете код в JSP, как указано в этом сообщении
  2. Проблема Runtime.exec с Tomcat при запуске в качестве службы Windows
person Aniket Kulkarni    schedule 07.10.2013
comment
@HlaingMyo: у вас опечатка String l_Time = = pData.getTimeStamp(); типа String l_Time = pData.getTimeStamp();. - person Aniket Kulkarni; 14.10.2013