Разница - выполнение команды unix через Java и через приглашение, т.е. нормальное выполнение - PullRequest
1 голос
/ 07 декабря 2011

Не могли бы вы помочь мне решить эту проблему.

У меня есть Java-код, который запускает команду rsync, используя объект времени выполнения.

Я выполняю приведенный ниже код на исходном компьютере. Если во время синхронизации на целевом компьютере возникнет какая-либо проблема с подключением rsync, код должен получить значение выхода, но сейчас этого не происходит.

String rsyncCommand = "rsync –abv  <source>  <remoteAddr:dest>"
Runtime rt = Runtime.getRuntime (); 
rt.exec(rsyncCommand);

Чтобы дать вам более подробную информацию:

Когда я запускаю команду rsync напрямую (не через код java) на исходном компьютере и если я уничтожаю процесс rsync на целевом компьютере, используя во время синхронизации параметр kill -9, процесс rsync в источнике завершится с сообщением о выходе.

Но если я запускаю rsync через свой Java-код и если я убиваю процесс во время синхронизации в target, он не получает никакого сообщения о выходе. Процессы Java и Rsync все еще находятся в рабочем режиме. Но не выполняет никаких задач.

В чем разница при запуске команды через Java и непосредственно через командную строку?

У любого человека есть схожие проблемы с rsync, есть ли у нас какие-либо другие варианты для запуска rsync через java, я пробовал и с «ProcessBuilder».

Пожалуйста, предоставьте мне несколько советов, чтобы решить эту проблему.


Спасибо за ответ, я дал только пример кода, ниже приведен полный код, который я использую в своем Java.

 Runtime rt = Runtime.getRuntime();
  Process proc = null; 
  try { 
   proc = rt.exec(rsyncCommand); 
   InputStream stderr = proc.getErrorStream();
   InputStreamReader isrErr = new InputStreamReader(stderr); 
   BufferedReader brErr = new BufferedReader(isrErr);

InputStream stdout = proc.getInputStream();
InputStreamReader isrStd = new InputStreamReader(stdout);
BufferedReader brStd = new BufferedReader(isrStd);

String val = null;
while ((val = brStd.readLine()) != null) {
    System.out.println(val);
}

while ((val = brErr.readLine()) != null) {
    System.out.println(val);
}
int exitVal = proc.waitFor();
} catch (Exception e) {
e.printStackTrace();

}

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

если вы сделаете это, и процесс еще не завершен, вы не получите выходное значение

Process process = rt.exec(rsyncCommand);
int exitValue = process.exitValue();

, вместо этого вы должны использовать

int exitValue = process.waitFor()

, тогда поток будет ждать, пока процессвозвращает значение выхода

1 голос
/ 07 декабря 2011

Ваш вызов exec () неверен, он должен указывать параметры напрямую, что-то вроде:

Runtime rt = Runtime.getRuntime (); 
rt.exec(new String[]{"rsync", "-abv", "<source>", "<remoteAddr:dest>"});

exec не выполняет синтаксический анализ командной строки, поэтому пытается выполнить команду с именем "rsync –abv" (в виде одной строки)

...