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

标签 java bash

我正在使用一个生成 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 会崩溃,因为它没有足够的内存。然而这种情况并没有发生,程序运行正常。

最佳答案

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

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

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

ulimit -m 2048000

限制虚拟内存使用:

ulimit -v 2048000

将虚拟内存限制设置为硬限制,这样当超过此限制时进程将被杀死:

ulimit -H -v

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

关于java - 使用有限的资源运行 bash 脚本/程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45455180/

相关文章:

java - EasyPHP 上的数据库服务器无法启动

java - 无法滚动视频进度条|超文本标记语言

java - 插件无法实例化类

java - 类不是抽象的,不会覆盖抽象方法

linux - 我如何在 bash 循环中从文件中分配这些配置变量

java - BlueJ 错误 : incompatible types: java. lang.String 无法转换为 java.lang.String[]

Bash - 在前两个脚本完成后运行第三个脚本

bash - 在终端的xcode phonegap项目中定义方案

bash - Azure ML Studio 笔记本使用 Python 3.6 内核而不是 3.8 内核来执行笔记本魔法 %%bash 命令?

linux - 在 Linux 中查找哪个驱动器对应哪个 USB 大容量存储设备