我希望用户在系统上以负的好值运行特定进程。我不能简单地将进程分叉到后台,因为这个特定程序是我的世界服务器,我依靠命令行来控制服务器。
我当前的 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
使用用户自己的 ID 检查 java 进程。可能有其他java实例在不同的用户下生成,但minecraft服务器在自己的用户下运行我的世界。
我显然不想每次启动服务器时都输入密码。
从/etc/sudoers:
minecraft ALL = NOPASSWD: /etc/renice
有没有更优雅的方法来做到这一点?简单地使用nice
不是一种选择,sudo nice bash
结合无密码:选项将是一个很大的安全问题。
答案1
pam_limits.so 模块可以帮助您。
它允许您对特定的单个用户和组或通配符或用户和组范围设置某些限制。
您可以设置的限制通常是 ulimit 设置,但也可以设置并发登录会话数、进程数、CPU 时间、默认优先级和最大优先级 (renice)。查看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
答案2
renice
没有它就sudo
不可能使用。我引用手册renice(1)
页:
超级用户以外的用户只能改变他们拥有的进程的优先级,并且只能在 0 到 PRIO_MAX (20) 范围内单调增加他们的“nice value”(出于安全原因),除非有一个nice资源限制设置(Linux 2.6.12 及更高版本)。