Выполнить системную команду Unix из проблемы JAVA - PullRequest
3 голосов
/ 26 августа 2011

У меня странная проблема с выполнением системной команды из кода JAVA.
На самом деле я хочу получить системную информацию Mac OSX из моего приложения JAVA.
Для этого я использую

Runtime.getRuntime().exec("system_profiler -detailLevel full");

Это работает нормально. Если я распечатаю вывод, это круто.Но я хочу записать эту информацию в файл plist для дальнейшего использования. Для этого я использую аргумент -xml system_profiler .like,

 String cmd = "system_profiler -detailLevel full -xml > "+System.getProperty( "user.home" )+"/sysinfo.plist";
 Process p = Runtime.getRuntime().exec(cmd); 

В основном это должно создать файл plist вдомашний каталог текущих пользователей.

Но это, похоже, ничего не записывает в файл.

Я что-то здесь упускаю?

Ответы [ 2 ]

7 голосов
/ 26 августа 2011

Моя Java более чем ржавая, поэтому, пожалуйста, будьте осторожны. ; -)

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

  2. Если вы просто используете:

    "/bin/sh -c system_profiler -detailLevel full > path/file.plist"
    

    Тогда строка будет разбита на:

    { "/bin/sh", "-c", "system_profiler", "-detailLevel", "full", ">", "path/file.plist" }
    

    Что также не сработает, потому что -c ожидает только один аргумент.

Попробуйте вместо этого:

String[] cmd = { "/bin/sh", "-c", "system_profiler -detailLevel full > path/file.plist" };
Process p = Runtime.getRuntime.exec(cmd);

Конечно, вы также можете просто прочитать вывод вашего Process экземпляра, используя Process.getInputStream(), и записать его в нужный файл; таким образом пропустить оболочку, перенаправление ввода-вывода и т. д. в целом.

5 голосов
/ 26 августа 2011

Christian.K абсолютно правильно. Вот полный пример:

public class Hello {

  static public void main (String[] args) {
    try {
      String[] cmds = {
        "/bin/sh", "-c", "ls -l *.java | tee tmp.out"};
      Process p = Runtime.getRuntime().exec (cmds);
      p.waitFor ();
      System.out.println ("Done.");
    }
    catch (Exception e) {
      System.out.println ("Err: " + e.getMessage());
    }
  }
}

Если бы вы не использовали канал (|) или перенаправление (>), то вы бы согласились с String cmd = "ls -l *.java", как в исходной команде.

Если вы действительно хотите увидеть любой вывод в окне консоли Java, то вам также нужно вызвать Process.getInputStream().

Вот хорошая ссылка: Запуск системных команд в приложениях Java

...