2011-09-28 40 views
0

我寫了一個程序來監視連接到Linux上的RAID某些硬盤驅動器的狀態。通過這個程序,我執行幾個命令行命令。一個有趣的錯誤發生雖然....程序運行好三分鐘,似乎它不能再正確執行它以前執行的命令(對於許多迭代)。進程生成遞增錯誤

因爲它似乎莫名其妙地錯過了驅動器(即使它發現它輕車熟路),它吐出了一個數組索引錯誤(我的變量driveLetters [d])。

其他注意事項......如果我告訴它重新詮釋「d」爲「0」,如果超過驅動器的數量...程序將不會崩潰,反而會剛剛成爲陷入無限循環。 此外,程序崩潰的時間也各不相同。它在一定數量的間隔後似乎不會崩潰。最後,我沒有得到任何類型的內存泄漏錯誤。

下面是一些代碼,應揭露錯誤:

public static void scsi_generic() throws IOException, InterruptedException 
{ 
    int i =0; 
    int d =0; 

    int numberOfDrives = 8; 

    char driveLetters[] = {'b','c','d','e','f','g','h','i','j','k','l','m'}; 

    String drive = ""; 

    while (i <= numberOfDrives) 
    { 
     System.out.println("position 1"); 
     List<String> commands = new ArrayList<String>(); 
     commands.add("cat"); 
     commands.add("/sys/class/scsi_generic/sg"+i+"/device/sas_address"); 


     SystemCommandExecutor commandExecutor = new SystemCommandExecutor(commands); 
     int driveFound = commandExecutor.executeCommand(); 


     if (driveFound == 0) 
     { 
      System.out.println("Folder: sg" + i + " was found."); 
      StringBuilder stdout = commandExecutor.getStandardOutputFromCommand(); 
      String data = stdout.toString(); 
      String sas = data.substring(11,12); 
      int sasA = Integer.parseInt(sas,16); 


      boolean matchedSG = false; 

      while (matchedSG == false) 
      { 
       System.out.println("position2");  
       List<String> lookSD = new ArrayList<String>(); 
       lookSD.add("test"); 
       lookSD.add("-d"); 
       lookSD.add("/sys/class/scsi_generic/sg"+i+"/device/block:sd" + driveLetters[d]); 
       SystemCommandExecutor commandSearch = new SystemCommandExecutor(lookSD); 
       int sdFound = commandSearch.executeCommand(); 
       StringBuilder stdout3 = commandSearch.getStandardOutputFromCommand(); 
       StringBuilder stderr = commandSearch.getStandardErrorFromCommand(); 
       String sdFound2 = stdout3.toString(); 

       if (sdFound == 0) 
       { 
        matchedSG = true; 
        System.out.println("Found the SD drive."); 
        drive = "sd"+driveLetters[d]; 
        System.out.println(sasA); 
        hdsas.set(sasA , sas); 
        d = 0; 
        i++; 
        loadDrives(drive , sasA); 
       } 
      /* else if (sdFound !=) 
       { 
        System.out.println("Error:" + sdFound); 
        System.out.println(d+ " "+ i); 
       } 
       */ 
       else if (d >= 8) 
       { 
        System.out.println("Drive letter: " + driveLetters[d]); 
        System.out.println("Int: " + i); 
        // System.out.println(sdFound2); 
        System.out.println("sd error: "+ sdFound); 
        // System.out.println(stderr); 
        //System.out.println(sdFound2 + " m"); 
       } 
       else 
       { 
        d++; 
       } 
      } 
     } 
     else 
     { 
      System.out.println("Folder: sg" + i + " could not be found."); 
      i++; 
     } 

     d =0; 
    } 
} 

任何幫助或建議將是真棒!謝謝。

編輯:

我找到的解決方案是,如果存在一個目錄,而不是通過Linux命令行做它使用Java庫,用於測試。

例:

File location = new File("directory"); 
if (location.exists()) 
{ 

} 

不知道爲什麼它的工作原理,並不會崩潰,那裏的Linux命令行的一小段時間後做,但它確實。

+0

時間使用調試器。 – bmargulies

+0

請清理您發佈的代碼的縮進以使其可讀。 –

+0

你是否在例外時打印了'd'? –

回答

0

我找到的解決方案是,如果存在一個目錄,而不是通過Linux命令行做它使用Java庫,用於測試。

例:

File location = new File("directory"); 
if (location.exists()) 
{ 

} 

不知道爲什麼它的工作原理,並不會崩潰,那裏的Linux命令行的一小段時間後做,但它確實。

1

這是沒有直接回答你的問題,但它仍然可以幫助你:

我經常要找到像你(很長的方法與「全局」變量代碼中的錯誤,那就是,在聲明的變量一個方法的開始,然後全部使用)。只需對代碼進行適當的重構(每種方法都有一個簡單的方法),錯誤的原因就會立即顯現出來,並在一秒之內得到修復(而重構本身需要更長的時間)。

我想這就是每個人都試圖爲您提供幫助的是無論如何:重構您的代碼(可能只是在頭上),以便更容易理解正在發生的事情。

+0

我設法解決了我的問題。不幸的是,stackoverflow不允許我將我的解決方案發布6個小時。只要時間到了,我會發布解決方案,現在我正在編輯我的帖子。謝謝! – Max

+0

+1自己解決 – michael667