2015-09-13 2 views
2

Я хотел бы запустить команду top -n 1 с использованием метода Runtime.getRuntime().exec(String) и получить вывод top -n 1 в мою программу на Java.Использование `Runtime.getRuntime(). Exec()` для получения результата из `top`

Я пробовал стандартный способ получения выходных данных процесса с помощью BufferedReader и использования возвращенных процессов InputStream, но не возвращающих данных.

Я также попытался следующие ...

 String path = "/home/user/Desktop/"; 
     String cmd = "#!/bin/sh\ntop -n 1 > " + path + "output"; 
     File shellCmd = new File(path + "topscript.sh"); 
     PrintWriter writer = new PrintWriter(shellCmd); 
     writer.write(cmd); 
     writer.flush(); 
     Runtime.getRuntime().exec("chmod +x " + shellCmd.getAbsolutePath()); 
     Runtime.getRuntime().exec(shellCmd.getAbsolutePath()); 

который создает shell script и выход, но выход пуст. Однако, если я затем загружу свой local shell и запустил script, что сделанный выше код, я получаю правильный вывод в выходном файле.

What's going wrong? 
+3

У вас есть поток вывода ошибок? например 'p.getErrorStream()' и что такое контент? – chengpohi

+0

@chengpohi А я не знал об этом методе. Это дало мне переменную окружения TERM не задано. –

+0

@chengpohi Таким образом, он не может выполнить скрипт, но он может создать скрипт, а затем 'chmod'. Как это может быть «chmod», но не может его запустить? –

ответ

3
String cmd = "#!/bin/sh\ntop -n1 -b > " + path + "output"; 
    File shellCmd = new File(path + "topscript.sh"); 
    PrintWriter writer = new PrintWriter(shellCmd); 
    writer.write(cmd); 
    writer.flush(); 
    Runtime.getRuntime().exec("chmod +x " + shellCmd.getAbsolutePath()); 

    ProcessBuilder pb = new ProcessBuilder(shellCmd.getAbsolutePath()); 
    Map<String, String> enviornments = pb.environment(); 
    enviornments.put("TERM", "xterm-256color"); 
    Process process = pb.start(); 

    BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    BufferedReader errorStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
    String str = inputStreamReader.readLine(); 
    System.out.println(str); 
    System.out.println(errorStreamReader.readLine()); 

Использование ProcessBuilder с установкой TERM переменные.

и если вы хотите перенаправить top в файл. необходимо добавить -b вариант, чтобы избежать error: initializing curses.

+1

Возможно, вы захотите использовать 'top -n 1 -b', чтобы сделать вывод более подходящим для перенаправления в файл. – Cinnam

+0

@Cinnam Спасибо, без '-b' вызовет ошибку: инициализация проклятий'. – chengpohi

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