Я хочу убедиться, что процесс будет убит через 10 секунд процессорного времени. Команда запуска Docker принимает флаг --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 или ':' работает. Или даже произвольное слово, которое печатает «команда не найдена», также работает.
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 (:), вызов процесса со временем также приводит к завершению процесса сразу после превышения времени ЦП.
docker run --rm -i -v /usr/local/src:/classes --ulimit cpu=10 java:8 \
bash -c 'time java -cp /classes/ InfiniteLoop'
top
, он должен указать, сколько времени процессора занял ваш процесс Java. Я полагаю, что бесконечный цикл, печатающий дату, не привязывает процессор и, вероятно, потребует гораздо больше времени, чем 10 секунд, чтобы получить 10 секунд времени процессора. - person programmerq   schedule 27.11.2016