我一直在玩 cset 来为正在运行的进程设置 cpu 亲和力。我正在使用 set 和 proc 手动重新创建内置的“屏蔽”函数,以便为我的应用程序的特定线程添加一些子集。我有一个 bash 脚本调用 cset 来创建集合,并将正确的线程移动到正确的集合。它在使用 sudo 运行时有效。
现在我想让另一个没有 sudo 权限的用户可以执行这个脚本。我足够信任这个用户,可以对 cset 负责,但不想开放 root 的广泛权力。
我认为 CAP_SYS_NICE —— sched_setaffinity 所需要的,我只是假设 cset 必须使用 —— 在脚本上就足够了,但这没有用。我尝试将 CAP_SYS_NICE 扩展到 cset 程序(这是 cset python 库的一个瘦 python 包装器)。没有骰子。cap_to_text 在我的 CAP_SYS_NICE 脚本上的输出是“=cap_ipc_lock,cap_sys_nice,cap_sys_resource+eip”(由于其他原因它有 ipc_lock 和 sys_resource;我认为只有 sys_nice 是相关的)。
有任何想法吗?
而是仅授予该用户受限的 sudo 权限以仅运行该脚本,例如:
NOPASSWD:
如果您希望用户使用他们的密码进行身份验证,请删除。我一直认为 cset 是一个 SuSE 工具。我在 EL5 的 RHEL 上使用它,但是对于 EL6,cgroups是处理屏蔽的首选方法。
我可能会走 sudo 路线,限制对将用户进程放入防护罩所需的特定命令的访问。
虽然 cgroups 似乎取代了 cset/cpusets(如 ewwhite 所说),但我还是继续使用旧方法,因为它更熟悉并且仍然有效。
对于权限问题,我的特殊问题是通过首先使用 cset 在 /cpusets 中创建一个树来解决的,我
sudo chown -R root:myusergroup /cpusets/mytree
和sudo chmod -R g+rwX /cpusets/mytree
. 之后,用户myusergroup
可以在树中移动进程echo $MYPID >> /cpusets/mytree/subtree/tasks
。不幸的是,如果没有对所有 /cpusets 的完全许可,cset 似乎无法工作——我相信它会在你每次运行命令时尝试重新读取整个 /cpusets 目录——所以我不得不求助于这种移动进程的手动方法。我并不是说它是每个人的理想解决方案,但它最适合我的背景和情况。