Запустить процесс (используя Runtime.exec / ProcessBuilder.start) с низким приоритетом - PullRequest
4 голосов
/ 29 января 2012

Мне нужно запустить системно-интенсивный процесс с низким приоритетом, чтобы он не замедлял работу моего сервера. Как я могу сделать это в Linux?

Это похоже на вопрос: Запустить процесс Java с низким приоритетом, используя Runtime.exec / ProcessBuilder.start? за исключением Linux вместо Windows. Это нормально, если приоритет процесса изменяется после его запуска (при условии, что нет большой задержки).

1 Ответ

10 голосов
/ 29 января 2012

Запустите команду, используя /usr/bin/nice. Например:

$ /usr/bin/nice -n 10 somecommand arg1 arg2

будет запускаться somecommand arg1 arg2 при привлекательности +10. (В Unix / Linux большее значение добротности приводит к более низкому приоритету планировщика. Диапазон nice обычно составляет от -19 до +19.)

Обратите внимание, что это решение зависит от платформы. Он будет работать только в системах Linux и Unix ...


СЛЕДОВАТЬ ВВЕРХ

ProcessBuilder должен создаваться так же, как любая обычная команда; т.е.

    new ProcessBuilder("nice", "-n", "10", "somecommand", "arg1", "arg2");

Нет чёрной магии в том, когда / как разделять команды / аргументы. Синтаксис команды (например, nice) определяет, какими аргументами она должна быть, и это определяет, как они должны заключаться в кавычки в командной строке оболочки, и как они должны предоставляться при использовании ProcessBuilder (или собственных системных вызовов exec* это важно).

Я не думаю, что должны быть проблемы с waitFor() и т. Д., Поскольку (AFAIK) команда /usr/bin/nice использует exec (не fork / exec) для запуска предоставленной команды. Попробуйте ...

...