我寫了一個程序來監視連接到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命令行的一小段時間後做,但它確實。
時間使用調試器。 – bmargulies
請清理您發佈的代碼的縮進以使其可讀。 –
你是否在例外時打印了'd'? –