2013-04-06 3 views
2

Я пытаюсь использовать ProcessBuilder для выполнения сценария оболочки на моем Linux-сервере, с сервлета, запущенного на WebSphere Application Server.ProcessBuilder.start() возвращает 0, но не выполняет сценарий оболочки

Код возвращает 0 (используя .waitFor()), но скрипт не работает. Если я помещаю недопустимый путь к скрипту, я получаю исключение «файл не найден», поэтому я знаю, что он находит скрипт ... но не работает.

Сам сценарий вызывает другой скрипт, который должен в конечном итоге выводить zip-файл (у меня также есть строка «touch», чтобы увидеть, что там происходит ... но ничего не делает).

Скрипт отлично работает из командной строки, используя ту же команду, что и я, передавая с .start().

Вот отрывок из моего Servlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    System.out.println("in doPost"); 


    System.out.println("about to kick off ProcessBuilder"); 
    ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh"); 
    pb.redirectErrorStream(true); 
    Process process = pb.start(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    int ch; 
    while ((ch = br.read()) != -1) 
     System.out.println((char)ch); 
    br.close(); 
    try { 
     int exitVal = process.waitFor(); 
     System.out.println("Exit Value: " + exitVal); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

.redirectErrorStream() и .getInputStream() должны были увидеть, если я мог бы поразить некоторые проблемы Buffer, которые я читал другие относятся к (хотя я Wouldn Не ожидайте, что .waitFor() вернет 0, если это так).

Это мой первый набег на ProcessBuilder, поэтому я надеюсь, что у меня просто отсутствует что-то очевидное.

Любые идеи/подсказки будут оценены.

Ах да ... вот выход я получаю:

[4/5/13 21:32:41:791 PDT] 0000004d SystemOut  O in doPost 
[4/5/13 21:32:41:791 PDT] 0000004d SystemOut  O about to kick off ProcessBuilder 
[4/5/13 21:32:41:818 PDT] 0000004d SystemOut  O Exit Value: 0 

Спасибо.

ответ

2

Понял работает .... Мне нужно установить рабочий каталог с помощью:

pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/")); 

Так окончательное решение выглядит следующим образом:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

System.out.println("in doPost"); 


System.out.println("about to kick off ProcessBuilder"); 
ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh"); 
pb.redirectErrorStream(true); 
pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/")); 
Process process = pb.start(); 
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
int ch; 
while ((ch = br.read()) != -1) 
    System.out.println((char)ch); 
br.close(); 
try { 
    int exitVal = process.waitFor(); 
    System.out.println("Exit Value: " + exitVal); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
0

Сценарий отлично работает из командной строки, используя ту же команду, что и я, передавая с .start().

Бьюсь об заклад, проблема заключается в том, что когда вы проверяете его из командной строки, вы делаете это под одной учетной записью пользователя, а WebSphere запускает ее под другой учетной записью. У двух учетных записей могут быть разные права доступа, разные настройки $PATH и т. Д. Тот факт, что сценарий оболочки работает под одной учетной записью, не означает, что он будет работать под другим. Тебе нужно это проверить.

+0

Извините ... не упомянул, в настоящее время у меня работает WebSphere под той же учетной записью, с которой я тестировал, из командной строки (корень). – gMoney

2

Вам просто нужно поместить скрипт в рабочем каталоге , При этом вам не нужно устанавливать каталог ProcessBuilder, выполняя pb.directory («directory»)

Смежные вопросы