如何允许用户将流程的优先级定为负面?


12

我希望用户使用负的尼斯值在系统上运行特定的进程。我不能简单地将进程分派到后台,因为此特定程序是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只是延迟执行renicerenice本身使用ps用户自己的ID来检查Java进程。在不同的用户下可能还会出现其他Java实例,但是minecraft服务器在其自己的用户minecraft下运行。

我显然不想每次启动服务器时都输入密码。
来自/ etc / sudoers

minecraft ALL = NOPASSWD: /etc/renice

有没有更优雅的方法可以做到这一点?与NOPASSWD:选项一起使用时nice,简单地使用不是一个选项,sudo nice bash这将是一个很大的安全问题。

Answers:


9

pam_limits.so模块可以为您提供帮助。

它允许您对特定的单个用户和组或通配符或用户和组的范围设置某些限制。

您可以设置的限制通常是ulimit设置,但也包括并发登录会话数,进程,CPU时间,默认优先级和最大优先级(限制)。有关更多信息,请参见limits.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   

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)的范围内单调增加其``nice值''(出于安全原因),除非有很好的资源限制设置(Linux 2.6.12及更高版本)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.