Unix Script не работает в Java Process Runtime.exec () - PullRequest
1 голос
/ 14 ноября 2009

Я разрабатываю приложение в Spring Web MVC, где мне нужно выполнить некоторые из сценариев Linux.

Я использую Tomcat версии 5.5 для запуска своего проекта в Linux ..

Мой код выглядит так:

Process proc = runtime.exec("sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt");
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
    System.out.println("\nOUTPUT = " + line);
}
System.out.print("\nbefore execute6");
try {
    if (proc.waitFor() != 0) {
       System.err.println("\nexit value = " + proc.exitValue());
    }
} catch (InterruptedException e) {
       System.err.println("\nERROR = " + e);
}

Здесь я хочу скопировать определенный файл из одного места в другое, используя скрипт Linux.

Но когда я выполняю эту часть, я получаю

exit value = 1

как вывод .. Я также попытался поместить этот скрипт в файл .sh и попытаться выполнить этот скрипт оболочки из Java-кода, но получаю тот же результат ..

Кто-нибудь может мне сказать, что должно быть причиной этого?

Заранее спасибо ..

Ответы [ 5 ]

2 голосов
/ 14 ноября 2009

Я бы предположил, что sudo ожидает интерактивный терминал для запроса пароля. Поскольку интерактивного терминала нет, он выводит сообщение об ошибке в stderr и завершает работу с кодом выхода 1. Вы не читаете поток ошибок, поэтому вы не увидите ни одного сообщения, которое может напечатать.

Вы обязательно захотите прочитать поток ошибок в любом случае. Сделав это сейчас, вы сможете диагностировать, что происходит на данный момент.

1 голос
/ 14 ноября 2009

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

1 голос
/ 14 ноября 2009

Предполагая, что вы можете запустить вашу команду из командной строки, войдя в систему как пользователь tomcat - попробуйте

ProcessBuilder pb = new ProcessBuilder("/usr/bin/sudo", "cp", 
                    "/var/tmp/mailserverfiles/editinterface.txt", 
                    "/etc/sysconfig/network-scripts/editinterface.txt");
pb.redirectErrorStream(true);
Process proc = pb.start();
... rest of code as before

если что-то не получится, начните отладку. Strace должен быть полезным. например запустить этот скрипт из вашего Java-приложения и выясните, где что-то не так, в файле /tmp/trace.txt:

#!/bin/sh

strace -f sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt  >/tmp/trace.txt 2>&1
1 голос
/ 14 ноября 2009

Возможно, ваш путь поиска странный и что "cp" и "sudo" не найдены при попытке выполнить команду

Вот несколько вещей, которые вы могли бы попытаться отследить, свою проблему (и):

  • Попробуйте запустить команду "cp" без "sudo".

  • Попробуйте указать полный путь к команде (ам). Это позволит избежать проблем с путями поиска.

  • По умолчанию "sudo" регистрирует неудачные команды, используя syslog (3). Посмотрите, можете ли вы найти следы в соответствующих лог-файлах.

1 голос
/ 14 ноября 2009

Я предполагаю, что пользователь, под которым работает Tomcat, имеет неограниченный доступ к sudo? И что это не запрашивается пароль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...