我的程序正在使用Linux系统调用setpriority()
来改变它创建的线程的优先级。它需要设置负优先级(-10),但是如文档中所述,在以普通用户身份运行时会失败。
用户需要CAP_SYS_NICE
权限才能按照自己的意愿设置优先级,但我不知道如何将这样的权限授予给用户。
因此,我的问题是:如何将CAP_SYS_NICE
权限设置给Linux用户?
我的程序正在使用Linux系统调用setpriority()
来改变它创建的线程的优先级。它需要设置负优先级(-10),但是如文档中所述,在以普通用户身份运行时会失败。
用户需要CAP_SYS_NICE
权限才能按照自己的意愿设置优先级,但我不知道如何将这样的权限授予给用户。
因此,我的问题是:如何将CAP_SYS_NICE
权限设置给Linux用户?
有一个方便实用的工具可以为二进制文件设置能力:setcap。它需要在应用程序二进制文件上以 root 权限运行,但一旦设置完成后,就可以在普通用户权限下运行。例如:
$ sudo setcap 'cap_sys_nice=eip' <application>
您可以使用 getcap 命令确认应用程序的能力:
$ getcap <application>
<application> = cap_sys_nice+eip
我建议在安装行中将能力集成到您的makefile中,该行通常以root身份运行。请注意,能力不能存储在TAR文件或任何衍生包格式中。如果您稍后要打包应用程序,则需要一个脚本(Debian软件包的postinst)来在部署时应用此功能。
cap_sys_nice=eip
这个参数,特别是 =eip
部分?我在 man setcap
和 man capabilities
中都没有看到这个。 - elmichaeip
代表什么?我可以用它来运行脚本吗? - vbtyourspecialusername hard nice -10
pam_cap.so
模块,它将读取/etc/security/capability.conf
文件并相应地设置能力。 - Bratchley#!/bin/bash
uid="$(id -u)"
gid="$(id -g)"
sudo --preserve-env \
setpriv --reuid="$uid" --regid="$gid" --init-groups \
--inh-caps +sys_nice --ambient-caps +sys_nice \
"$@"
/usr/local/bin/chyort
并对其进行chmod +x
。chyort
前缀。$ chyort jackd -d alsa -r 44100 -p 256
niceuser ALL=NOPASSWD:/usr/bin/nice
然后它正常工作了:
niceuser@localhost $ nice
0
niceuser@localhost $ sudo nice -n -10 nice
-10