有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用有限资源运行bash脚本/程序的java

我正在使用一个生成PDF文件的工具,不幸的是,它不是100%可靠的。有时,这个工具会进入无限循环,并消耗100%的内存和处理器

我正在使用Runtime.getRuntime.exec("command")从Java应用程序运行此工具

  1. 有没有一种方法可以直接在Java命令中设置此进程的最大执行时间/内存
  2. 如果不是直接从Java,是否有办法将命令包装到某个bash工具中,从而限制资源

我更喜欢命令失败,而不是利用所有资源,基本上杀死服务器

编辑

基于ulimit的建议,我正在尝试:

Runtime.getRuntime()
       .exec(arrayOf("bash", "-c", "ulimit -m 2; ulimit -a; pdfprint"))

我可以看到ulimit的作品:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) 2
open files                      (-n) 10240
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) 2

奇怪的是,我预期pdfprint会崩溃,因为它没有足够的内存。但是,这种情况不会发生,并且程序运行正常


共 (2) 个答案

  1. # 1 楼答案

    我不知道运行时对您是否是必需的,但它是与java JDK一起使用的<;5,随后引入了ProcessBuilder。 有了ProcessBuilder,您可以将过程waitFor(..)方法结合起来。 在Java8中,他们向这个方法引入了参数

    看起来像(取自原始指南):

    boolean waitFor(long timeout, TimeUnit unit)
    

    Causes the current thread to wait, if necessary, until the subprocess represented by this Process object has terminated, or the specified waiting time elapses.

    下面的伪代码示例显示了它的工作原理:

    ProcessBuilder pb = new ProcessBuilder("command");
            Process p = pb.start();
            p.waitFor(...);
    
  2. # 2 楼答案

    更好的解决方案是编辑bash脚本并添加限制

    您可以通过Bash脚本限制内存使用,执行以下操作

    将内存使用限制为kb(本例中为2GB):

    ulimit -m 2048000
    

    限制虚拟内存使用:

    ulimit -v 2048000
    

    将虚拟内存限制设置为硬限制,以便在超过此限制时终止进程:

    ulimit -H -v
    

    对于CPU限制,您可以使用cpulimit工具