Как я могу позволить пользователю расставить приоритеты для процесса с отрицательной привлекательностью?

12

Я хочу, чтобы пользователь запускал определенный процесс в системе с отрицательным значением nice. Я не могу просто перевести процесс в фоновый режим, поскольку эта конкретная программа является сервером Minecraft, и я полагаюсь на командную строку для управления сервером.

Мой текущий скрипт bash выглядит так (важная часть):

sleep 10 && \
sudo renice -n $NICENESS $(ps -u $(id -u) -o "%p:%c" | sed -n "s/:java$//p") & \
java -Xmx8G -Xms2G -jar minecraft_server.jar nogui    

sleepпросто задерживает исполнение renice. reniceсам использует psдля проверки процесса Java, используя собственный идентификатор пользователя. Могут быть и другие случаи появления Java под разными пользователями, но сервер minecraft работает под собственным пользователем minecraft .

Я, очевидно, не хочу вводить пароль каждый раз, когда я запускаю сервер.
из / etc / sudoers :

minecraft ALL = NOPASSWD: /etc/renice

Есть ли более элегантный способ сделать это? Простое использование niceне является опцией, sudo nice bashв сочетании с опцией NOPASSWD: было бы большой проблемой безопасности.

Baarn
источник

Ответы:

9

Модуль pam_limits.so может помочь вам в этом.

Это позволяет вам устанавливать определенные ограничения для конкретных отдельных пользователей и групп или групповых символов или диапазонов пользователей и групп.

Ограничения, которые вы можете установить, - это, как правило, настройки ulimit, а также количество одновременных сеансов входа в систему, процессы, время процессора, приоритет по умолчанию и максимальный приоритет (renice). Проверьте man-страницу limit.conf для получения дополнительной информации.

Например, вы можете настроить свою группу Mindcraft так, чтобы все их процессы запускались с повышенным приоритетом по умолчанию, и вы можете позволить им использовать команды nice и renice для ручного увеличения приоритета их важных заданий вместо того, чтобы только уменьшать приоритет.

# /etc/security/limits.conf
# increase default and max prio for members of the mindcraft group
@mindcraft   hard priority -10
@mindcraft   hard nice     -18   
HBruijn
источник
4
Установка только жесткого предела для nice, кажется, не делает этого, я должен был установить оба, используя -.
Баарн
Кажется, у меня вообще не работает в Ubuntu 16.04. Я установил priority-10 и nice-15, и я всегда получаю «разрешение запрещено», даже когда я пытаюсь использовать «nice -n -2» для чего-то. Нужно ли перезагружаться? Я только что вышел и снова в соответствии с этим советом .
Ричард Уайзман
Обновление в моем предыдущем посте ... После перезагрузки я обнаружил, что priorityнастройка действует, но niceнастройка позволяет только уменьшить приоритет. Когда я запускаю что-то с приоритетом по умолчанию, сейчас это -10. Я могу reniceобработать до -9, но потом не могу reniceвернуться к -10.
Ричард Уайзман
Обновление 2: я решил это! Это было использование, hardкоторое вызвало проблемы. Я изменил его -вместо этого, и теперь все работает нормально. Этот ответ помог мне докопаться до сути. Я думаю, что проблема заключалась в том, что у меня был мягкий предел, который мешал, возможно, переопределял жесткий предел каким-то образом. Во всяком случае, -вместо того , чтобы hardисправить это для меня.
Ричард Уайзман
1

Использование reniceбез sudoбыло бы невозможно. Я цитирую со renice(1)страницы руководства :

Пользователи, отличные от суперпользователя, могут изменять только приоритет процессов, которыми они владеют, и могут только монотонно увеличивать свое «хорошее значение» (по соображениям безопасности) в диапазоне от 0 до PRIO_MAX (20), если только не ограничен хороший ресурс установить (Linux 2.6.12 и выше).

Джозеф Р.
источник