当前位置: 首页 > 知识库问答 >
问题:

java.io。IOException:无法运行程序“/bin/bash”:错误=24,打开的文件太多

芮星海
2023-03-14

我正在使用线程每5秒钟通过终端连接wmac。但是我在1天后得到了“java.io.IOException:无法运行程序”/bin/bash“: error=24,打开的文件太多”。

线程程序:

    public void run() {     
    try {
        while (true) {

            if (isStopIssued()) {
                break;
            }
            setStatus("SLEEP");

            Thread.sleep(5000);
            if (isStopIssued()) {
                break;
            }
            setStatus("ACTIVE");

            process();

            if (isStopIssued()) {
                break;
            }
        }

    }
    catch (InterruptedException e) {
        logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
    }       
}

工艺方法:

private void process() {
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
    Process p = null;
    int exit = 0;
    BufferedWriter p_stdin = null;
    OutputStreamWriter osw = null;
    String inDir = inputDir + "/" + inputFile;
    String errDir = errorDir + "/" + errorFile;
    String outDir = outputDir + "/" + outputFile;
    logger.debug("[JWMILoader] - Input Directory ---> " + inDir);
    logger.debug("[JWMILoader] - Output Directory ---> " + outDir);
    logger.debug("[JWMILoader] - Error Directory ---> " + errDir);
    File inFile = new File(inDir);
    File errFile = new File(errDir);
    try {
        p = builder.redirectOutput(inFile).start();  **// Line Number : 194 **
        p = builder.redirectError(errFile).start();
    }
    catch (IOException e) {
        logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
    }
    osw = new OutputStreamWriter(p.getOutputStream());
    // get standard input of shell

    p_stdin = new BufferedWriter(osw);

    // execute the desired command (here: wmic) n times
    try {
        // single execution
        p_stdin.write(wmiQuery);
        p_stdin.newLine();
        p_stdin.flush();
    }
    catch (IOException e) {
        logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
    }

    // finally close the shell by execution exit command
    try {
        p_stdin.write("exit");
        p_stdin.newLine();
        p_stdin.flush();
    }
    catch (IOException e) {
        logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
    }
    finally {
        try {
            p_stdin.close();
            exit = p.waitFor();
            logger.debug("[JWMILoader] - WQL Query Successfully Executed. Process Exit ---> " + exit);

        }
        catch (IOException | InterruptedException e) {
            logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
        }
    }
if (p != null) {
                p.destroy();
            }
}

例外:

java.io.IOException: Cannot run program "/bin/bash": error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
at mavens.imlog.etl.loader.JWMILoader.remoteConnection(JWMILoader.java:194)
at mavens.imlog.etl.loader.JWMILoader.process(JWMILoader.java:156)
at mavens.imlog.etl.loader.JWMILoader.run(JWMILoader.java:64)
Caused by: java.io.IOException: error=24, Too many open files
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 3 more

我用的是CENT OS。

请朋友们帮助我,如何解决这个问题。

共有1个答案

仰经武
2023-03-14

您两次启动流程,

  1. 第一个在文件中运行输出的文件,
  2. 第二个在文件中运行输出

这是你最初的意图吗?

try {
    p = builder.redirectOutput(inFile).**start()**;  **// Line Number : 194 **
    p = builder.redirectError(errFile).**start()**;
}
catch (IOException e) {
    logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}

只摧毁最后一个被创造出来的。

  if (p != null) {
            p.destroy();
  }

修复此问题,这应该可以修复您的错误。

附言:

仅启动一次:

try {
    builder = builder.redirectOutput(inFile);
    p = builder.redirectError(errFile).start();
}
 类似资料:
  • 我正在编写一个需要读取/写入大量文件的遗传算法。GA的适用性测试是调用一个名为的程序,该程序将文件作为输入并生成文件作为输出。 一切都在工作,除非我使遗传算法的种群规模和/或总代数太大。然后,经过这么多代人,我开始得到这个:(我为许多不同的文件反复得到它,索引 只是我上次运行它时首先出现的那个)。这很奇怪,因为我不是在第一代或第二代之后得到错误,而是在相当多的世代之后,这表明每一代都会打开更多它没

  • 我得到了异常java.net。BindException:无法分配请求的地址,如果发生此异常,我会尝试使用相同的端口和主机再次绑定它。但在尝试绑定之后,我得到了java.io。IOException:打开的文件太多。 堆栈跟踪: 在一些失败之后: 当java.net时,FD是否可能保持打开状态。BindException:无法分配请求的地址?

  • 问题内容: 我使用多个文件来执行一些文件I / O(写入19个文件,确实如此)。写他们几百次后,我得到了。但实际上我一次只能打开几个文件。这里有什么问题?我可以验证写入是否成功。 问题答案: 在Linux和其他UNIX /类似UNIX的平台上,操作系统对进程在任何给定时间可能具有的打开文件描述符的数量进行了限制。在过去,此限制曾经是硬接线1,并且相对较小。如今,它要大得多(几百/千),并且受“软”

  • 问题内容: 我已经与Tornado进行了很多合作,但这是我第一次遇到这种错误。我一直在研究一个非常基本的URL缩短器。URL由另一种应用程序放入数据库中,该应用程序仅从MongoDB存储中读取URL并重定向客户端。编写基本代码后,我针对它设置了一个简单的“ Siege”测试,在运行siege(针对4个应用程序线程运行)约30秒钟之后,我开始获得500个响应。查看错误日志,我看到了; 重要(我想);

  • 我想知道太多文件打开错误的确切问题。我通过谷歌寻找解决方案,但我不知道为什么会出现这个问题以及如何解决这个问题。 堆栈错误:严重:套接字接受失败。网SocketException:java上打开的文件太多。网普通袜子。java上的socketAccept(本机方法)。网抽象素socketimpl。在java上接受(AbstractPlainSocketImpl.java:398)。网服务器插座。j

  • 我有一个错误:PHP无法打开流:打开的文件太多。 我在这里查看了stackoverflow的各种答案,但我无法解决这个问题。我主要尝试增加最大打开文件数的限制: 我已编辑/等/安全/限制。conf,其中我指定了: 保存并注销/重新启动该框后,命令: 仍打印出1024个。我不知道为什么这没有效果,我想这就是我得到php错误的原因。如果需要,我可以粘贴整个文件或任何其他配置文件。我使用的是PHP 5.