2015-06-28 70 views
1

我想使用top命令獲取進程信息。我有下面的代碼,但它不工作,它只存在沒有任何輸出的程序。我的目標是獲取進程名稱,進程ID和內存使用情況,但這是後面的部分。目前,我一直在使用grep在Java中使用top命令獲取進程信息。在java中使用top命令查找進程信息

public void getProcessInfo(String processName) { 
    Runtime rt = Runtime.getRuntime(); 
    try { 
     String[] cmd = { "/bin/sh", "-c", "top | grep " + processName }; 
     Process proc = rt.exec(cmd); 
     InputStream stdin = proc.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(stdin); 
     BufferedReader br = new BufferedReader(isr); 
     String line = null; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line);  
     } 
    } catch (Exception e) { 
     e.printStackTrace(e); 
    } 
} 

回答

0

Runtime.exec已過時。改爲使用ProcessBuilder

通過完全避免使用grep或任何管道,您可以使您的任務變得相當容易。誰擁有Java時需要grep?

上arkascha的回答

大廈,你可以這樣做:

String processLine = null; 

ProcessBuilder builder = new ProcessBuilder("top", "-b", "-n", "1"); 
Process proc = builder.start(); 

try (BufferedReader stdin = new BufferedReader(
    new InputStreamReader(proc.getInputStream()))) { 

    String line; 
    while ((line = stdin.readLine()) != null) { 
     if (line.contains(processName)) { // No need for grep 
      processLine = line; 
      break; 
     } 
    } 
} 

你可能想跳過的摘要信息,標題行:

String processLine = null; 

ProcessBuilder builder = new ProcessBuilder("top", "-b", "-n", "1"); 
Process proc = builder.start(); 

try (BufferedReader stdin = new BufferedReader(
    new InputStreamReader(proc.getInputStream()))) { 

    String line; 

    // Blank line indicates end of summary. 
    while ((line = stdin.readLine()) != null) { 
     if (line.isEmpty()) { 
      break; 
     } 
    } 

    // Skip header line. 
    if (line != null) { 
     line = stdin.readLine(); 
    } 

    if (line != null) { 
     while ((line = stdin.readLine()) != null) { 
      if (line.contains(processName)) { // No need for grep 
       processLine = line; 
       break; 
      } 
     } 
    } 
} 
+0

真棒,我用包含而不是grep,它的工作謝謝你VGR和arkascha –

2

這個問題已經被問和回答過很多次:

在正常模式下top命令不輸出stdout,這就是爲什麼你不能簡單地管其輸出到另一個CLI實用程序你試着去做。相反,您必須使用-b標誌將命令切換到「批處理模式」。此外,你必須迭代次數限制到一個單一的,如果你要處理的結果(在非交互模式沒有意義的進一步的迭代):

top -b -n 1 | grep "whatever" 

這是記錄在命令手冊頁:man top

與您的項目玩得開心!

+0

試圖左右逢源 過程proc等於rt.exec( 「top -b | grep java」); and String [] cmd = {「/ bin/sh」,「-c」,「top -b | grep」+ name}; Process proc = rt.exec(cmd); 無法正常工作 –

+0

對不起,忘了提及您還必須防止'top'迭代。再次,這是在手冊頁中記錄...希望事情爲你工作:-) – arkascha