docker run --ulimit cpu = 10在超时后不会杀死java进程

时间:2016-11-27 08:20:51

标签: ubuntu docker ulimit

我想确保在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选项?

编辑1:

$ 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'

1 个答案:

答案 0 :(得分:1)

在一些experimenting之后,我重新阅读了原始问题,并考虑到它与正在启动的程序类型无关,即Java,C ++等:它之所以如此在一个案例中工作(当使用bash -c调用时)而不是直接调用它时ulimitbash built in commanddocker run的文档是{{3} }。