我想确保在10秒的CPU时间后进程被终止。 Docker run命令接受应该执行该操作的标志--ulimit cpu=10
。
但是当我使用它运行java命令时,忽略ulimit设置。具有无限循环的java进程即使在10秒后也会继续(实际上是几分钟直到我杀了它) 这是我用来测试的命令。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
java -cp /classes/ InfiniteLoop
不是直接调用java,如果我启动bash然后运行java c,它会按预期工作。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c 'date; java -cp /classes/ InfiniteLoop'
为什么直接调用java程序不尊重ulimit选项?
$ docker --version
Docker version 1.9.1, build a34a1d5
java程序是InfiniteLoop.java
import java.util.*;
class InfiniteLoop {
public static void main(String[] args) throws Exception {
for (long i = 0; i < 1000_000_000_000L; i++) {
if (i % 1_000_000_000 == 0) {
System.out.println(new Date() + ", i = " + i);
}
}
}
}
编辑2: 以下也不起作用。也就是说,只有在bash中执行java。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c 'java -cp /classes/ InfiniteLoop'
但是,添加任何noop或&#39;:&#39;命令有效。甚至是打印&#34;命令未找到的任意单词&#34;也有效。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c ':; java -cp /classes/ InfiniteLoop'
这也有效。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c 'ArbirtraryCommandNotFound; java -cp /classes/ InfiniteLoop'
编辑3: 与使用no-op(:)类似,随着时间调用进程也会使进程在超过CPU时间后被完全杀死。
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c 'time java -cp /classes/ InfiniteLoop'
答案 0 :(得分:1)
在一些experimenting之后,我重新阅读了原始问题,并考虑到它与正在启动的程序类型无关,即Java,C ++等:它之所以如此在一个案例中工作(当使用bash -c
调用时)而不是直接调用它时ulimit
是bash built in command而docker run
的文档是{{3} }。