Я написал программу для мониторинга состояния некоторых жестких дисков, подключенных к RAID в Linux. С помощью этой программы я выполняю несколько команд командной строки. Однако возникает интересная ошибка ... программа запускается добрых три минуты, прежде чем кажется, что она больше не может правильно выполнять команду, которую выполняла ранее (для многих итераций).
Он выдает ошибку индекса массива (моя переменная driveLetters [d]), потому что он, похоже, как-то пропустил диск (даже если он нашел его сотни раз раньше).
Другие вещи, на которые стоит обратить внимание ... если я скажу сбросить int "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;
}
}
Любая помощь или предложения будут великолепны! Благодаря.
EDIT:
Решение, которое я нашел, состояло в том, чтобы использовать библиотеку java для тестирования, если каталог существует, а не через командную строку linux.
Ex:
File location = new File("directory");
if (location.exists())
{
}
Понятия не имею, почему он работает и не падает, где, как это делала командная строка Linux через короткий промежуток времени, но это так.