当前位置: 首页 > 面试题库 >

Process Builder waitFor()问题和打开文件限制

何麻雀
2023-03-14
问题内容

我继承了一些代码:

Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();

基本上,出于某些古老且基于伏都教的原因,将键/值对作为文件存储在磁盘上。我真的不想参加。

但是,我还有很多IO异常:

Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files

一堆我的意思是1万-百万

我感觉到waitFor调用是要阻止这些等待发生以等待过程完成并退出,但是我认为chmod在实际关闭文件之前会返回结果。有人知道这是否是导致这些异常的原因吗?

我的另一种倾向是,在Java端,打开和关闭数千个文件的速度不够快,并且还有其他事情在进行,也许像是某种形式的文件缓冲区在什么时候没有被清除掉fw.close()被调用。

我对Java很陌生,这真是一个让我感到困惑的地狱怪异的故事。(高兴的是,该应用程序仍然以某种方式运行..在吐出一个很大的日志文件之后)

其他人能想到解决此问题的方法吗,清除缓冲区或将文件打开限制增加到jvm可以跟上的水平(假设这是问题所在)


问题答案:

我认为您正在循环运行这些chmod命令-
否则我不明白为什么会有那么多异常。您可能因为未读取生成的进程的输出而陷入僵局。这当然用来咬我回到前ProcessBuilderRuntime.exec()天。

将您的代码段更改为上述模式:

try {
    ProcessBuilder pb = new ProcessBuilder("/bin/chmod", "777", path);    
    pb.redirectErrorStream(true); // merge stdout, stderr of process

    Process p = pb.start();
    InputStreamReader isr = new  InputStreamReader(p.getInputStream());
    BufferedReader br = new BufferedReader(isr);

    String lineRead;
    while ((lineRead = br.readLine()) != null) {
        // swallow the line, or print it out - System.out.println(lineRead);
    }

    int rc = p.waitFor();
    // TODO error handling for non-zero rc
}
catch (IOException e) {
    e.printStackTrace(); // or log it, or otherwise handle it
}
catch (InterruptedException ie) {
    ie.printStackTrace(); // or log it, or otherwise handle it
}

(来源:此网站),看看是否有帮助。



 类似资料:
  • 本文向大家介绍PHP 文件上传限制问题,包括了PHP 文件上传限制问题的使用技巧和注意事项,需要的朋友参考一下 PHP 大文件上传占用大量资源,因此需要对上传的大小进行限制,以下为相关的三个参数: client_max_body_size upload_max_filesize post_max_size 与以上相对应的三个报错信息: Warning: POST Content-Length of

  • 主要内容:先说一下PDB文件是什么,如何修复这个错误有时候,我们使用 VS(Visual Studio)编译程序时会出现“无法查找或打开PDB文件”的提示,并且此时程序会生成失败,无法运行,如下图所示: 大家不要惊慌,出现这种提示并不是代码写错了,而是编译器设置的问题,改一下设置就 OK 了。 先说一下PDB文件是什么 当程序在 VS 上编译时,程序所依赖的所有动态链接库(dll 文件)也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又

  • 我读过关于类似问题的帖子,但它们似乎都略有不同,因此这篇帖子。 我有一个带有网站(例如example.com)的域,运行良好。我现在正在使用Flask应用程序(主域不是Flask应用程序)创建子域(例如sub.example.com),该应用程序也连接到SQLite数据库(在同一文件夹中)。 为子域设置A记录后,访问子域地址时,我在浏览器中收到以下错误消息:“禁止。您没有访问此资源的权限。” 我做

  • 上图这个文件一直是我专门安装软件的文件夹,但是不知道为什么我往里解压文件现在要管理员权限了,我要怎么把它变成和下图一样不需要权限的普通文件夹呢

  • 问题内容: 几周前,我从共享主机迁移到了VPS,并且遇到了WordPress这些烦人的权限问题。您知道可以从管理面板下载和升级插件(和wordpress本身),但是自从我将其移动后,它开始询问我的FTP凭据,这在我不得不更新约20个插件时有点慢。 我认为这应该是某种权利问题。我查看了共享的托管wordpress文件,它们都属于用户名和组kovshenin(kovshenin:kovshenin),