2015-09-11 3 views
0

Вот как выглядит моя программа какНе удается получить значение выполнения команды «Lsof»

Reference

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class ExecuteShellCommand { 

    public static void main(final String[] args) { 

    final ExecuteShellCommand obj = new ExecuteShellCommand(); 
    final String ping = "ping -c 3 google.com"; 
    final String lsof = "lsof | wc -l"; 
    final String output = obj.executeCommand(ping); 
    System.out.println(output); 
    } 

    private String executeCommand(final String command) { 
    final StringBuffer output = new StringBuffer(); 
    final Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     final int waitForStatus = p.waitFor(); 
     System.out.println("waitForStatus=" + waitForStatus); 
     final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
     output.append(line + "\n"); 
     } 
    } catch (final Exception e) { 
     e.printStackTrace(); 
    } 
    return output.toString(); 
    } 
} 

Когда я запускаю эту программу мой выход ничего

Process finished with exit code 0 

Однако , когда я запускаю ту же команду на своей машине, я вижу

$ lsof | wc -l 
    8045 

В чем проблема?

UPDATE Когда я бегу final String ping = "ping -c 3 google.com"; как команда, я вижу выход в

waitForStatus=0 
PING google.com (216.58.192.14): 56 data bytes 
64 bytes from 216.58.192.14: icmp_seq=0 ttl=59 time=7.412 ms 
64 bytes from 216.58.192.14: icmp_seq=1 ttl=59 time=8.798 ms 
64 bytes from 216.58.192.14: icmp_seq=2 ttl=59 time=6.968 ms 

--- google.com ping statistics --- 
3 packets transmitted, 3 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 6.968/7.726/8.798/0.779 ms 

но final String lsof = "lsof | wc -l";, я получаю

waitForStatus=1 


Process finished with exit code 0 
+0

Можете ли вы получить результаты из любого другого процесса? Что такое статус, возвращаемый 'p.waitFor()'? Есть ли ошибка? –

+0

'waitForStatus = 1'. что-то не так – daydreamer

+0

попробуйте без '| wc -l' –

ответ

1

Вы не должны использовать Runtime.exec. Он устарел более десяти лет. Его замена - ProcessBuilder.

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

Однако вам вообще не нужна труба. Java работает так же хорошо, как и при выполнении той же работы:

long count; 

ProcessBuilder builder = new ProcessBuilder("lsof"); 
builder.inheritIO().redirectOutput(ProcessBuilder.Redirect.PIPE); 

try (BufferedReader reader = new BufferedReader(
     new InputStreamReader(builder.start().getInputStream())) { 
    count = reader.lines().count(); 
} 
Смежные вопросы