我编写了一个程序来监控连接到Linux上的RAID的某些硬盘驱动器的状态。通过这个程序,我执行了几个命令行命令。虽然发生了一个有趣的错误....程序运行了好三分钟,然后它似乎无法再正确执行它之前执行的命令(对于许多迭代)。
它吐出一个数组索引错误(我的变量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;
}
}
任何帮助或建议都会很棒!感谢。
编辑:
我发现的解决方案是使用java库来测试目录是否存在而不是通过linux命令行进行测试。
例如:
File location = new File("directory");
if (location.exists())
{
}
不知道它为什么会起作用并且不会崩溃,就像linux命令行在短时间内所做的那样,但确实如此。
答案 0 :(得分:1)
这不是你问题的直接答案,但它仍然可以帮到你:
我经常要在像你这样的代码中找到bug(带有“全局”变量的非常长的方法,即在方法开头声明并在全部使用的变量)。只需正确地重构代码(每个单一目的的简短方法),我就会立即看到错误的原因,并在一秒钟内修复(而重构本身需要更长的时间)。
我想这就是每个人都试图为你提供帮助的方法:重构你的代码(可能只在一个人的头脑中),以便(更多)更容易理解正在发生的事情。
答案 1 :(得分:0)
我发现的解决方案是使用java库来测试目录是否存在而不是通过linux命令行进行测试。
例如:
File location = new File("directory");
if (location.exists())
{
}
不知道它为什么会起作用并且不会崩溃,就像linux命令行在短时间内所做的那样,但确实如此。