我的程序正在使用Linux系统调用setpriority()
来更改它创建的线程的优先级.它需要设置负优先级(-10),但是,如文档中所述,当以普通用户身份运行时,这会失败.
用户需要CAP_SYS_NICE
能够根据需要设置优先级,但我不知道如何为用户提供此类功能.
所以我的问题是:如何为CAP_SYS_NICE
Linux用户设置功能?
Rya*_*ong 11
有一个非常方便的实用程序来设置二进制文件的功能:setcap.这需要在应用程序二进制文件上以root身份运行,但一旦设置,就可以作为普通用户运行.例:
$ sudo setcap 'cap_sys_nice=eip' <application>
Run Code Online (Sandbox Code Playgroud)
您可以使用getcap确认应用程序的功能:
$ getcap <application>
<application> = cap_sys_nice+eip
Run Code Online (Sandbox Code Playgroud)
我建议将这些功能集成到安装行中的makefile中,无论如何通常以root身份运行.请注意,功能无法存储在TAR文件或任何衍生包格式中.如果您稍后打包应用程序,则需要一个脚本(Debian软件包的postinst)来应用部署功能.
Jan Hudec 是对的,进程不能只给自己一种能力,而 setuid 包装器是获得该能力的明显方法。另外,请记住,prctl(PR_SET_KEEPCAPS, ...)
当您放弃 root 时,您将需要这样做。(prctl
有关详细信息,请参阅手册页。)否则,当您转换为非 root 真实用户 ID 时,您将放弃该功能。
如果您确实只想启动具有不同允许的良好级别的用户会话,您可能会看到pam_limits
和limits.conf
手册页,因为该pam_limits
模块允许您更改硬性良好限制。它可能是这样的一行:
yourspecialusername hard nice -10
Run Code Online (Sandbox Code Playgroud)