Process Builder增加错误

时间:2011-09-28 20:29:10

标签: java linux command-line

我编写了一个程序来监控连接到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命令行在短时间内所做的那样,但确实如此。

2 个答案:

答案 0 :(得分:1)

这不是你问题的直接答案,但它仍然可以帮到你:

我经常要在像你这样的代码中找到bug(带有“全局”变量的非常长的方法,即在方法开头声明并在全部使用的变量)。只需正确地重构代码(每个单一目的的简短方法),我就会立即看到错误的原因,并在一秒钟内修复(而重构本身需要更长的时间)。

我想这就是每个人都试图为你提供帮助的方法:重构你的代码(可能只在一个人的头脑中),以便(更多)更容易理解正在发生的事情。

答案 1 :(得分:0)

我发现的解决方案是使用java库来测试目录是否存在而不是通过linux命令行进行测试。

例如:

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

}

不知道它为什么会起作用并且不会崩溃,就像linux命令行在短时间内所做的那样,但确实如此。