使用有限资源运行bash脚本/程序的java
我正在使用一个生成PDF文件的工具,不幸的是,它不是100%可靠的。有时,这个工具会进入无限循环,并消耗100%的内存和处理器
我正在使用Runtime.getRuntime.exec("command")
从Java应用程序运行此工具
- 有没有一种方法可以直接在Java命令中设置此进程的最大执行时间/内存李>
- 如果不是直接从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
会崩溃,因为它没有足够的内存。但是,这种情况不会发生,并且程序运行正常
# 1 楼答案
我不知道运行时对您是否是必需的,但它是与java JDK一起使用的<;5,随后引入了ProcessBuilder。 有了ProcessBuilder,您可以将过程和waitFor(..)方法结合起来。 在Java8中,他们向这个方法引入了参数
看起来像(取自原始指南):
下面的伪代码示例显示了它的工作原理:
# 2 楼答案
更好的解决方案是编辑bash脚本并添加限制
您可以通过Bash脚本限制内存使用,执行以下操作
将内存使用限制为kb(本例中为2GB):
限制虚拟内存使用:
将虚拟内存限制设置为硬限制,以便在超过此限制时终止进程:
对于CPU限制,您可以使用
cpulimit
工具