cset设置为非root用于为正在运行的进程设置cpu关联

我一直在玩cset设置正在运行的进程的CPU亲和力。 我正在使用set和proc手动重新创build内置的“屏蔽”function,为我的应用程序的特定线程添加一些子集。 我有一个bash脚本调用cset来创build集合,并将正确的线程移动到正确的集合。 它与sudo运行时工作。

现在我想让这个脚本可以由另一个没有sudo权限的用户执行。 我相信这个用户足以对cset负责,但不想打开根的广泛权力。

我以为CAP_SYS_NICE – 这是sched_setaffinity,我只是假设cset必须使用 – 所需要的 – 这是足够的,但这是行不通的。 我试着将CAP_SYS_NICE扩展到cset程序(这是一个用于cset python库的瘦python包装器)。 没有骰子。 在我的CAP_SYS_NICE'd脚本上的cap_to_text的输出是“= cap_ipc_lock,cap_sys_nice,cap_sys_resource + eip”(它有ipc_lock和sys_resource由于其他原因;我认为只有sys_nice是相关的)。

有任何想法吗?

而只是给这个用户限制sudo权限才能运行该脚本,例如:

bob ALL=(root) NOPASSWD: /usr/local/bin/cset.sh 

删除NOPASSWD:如果你想让用户用他们的密码进行authentication。

我一直认为cset是一个SuSE工具。 我在ELEL上使用它,但是在EL6中, cgroups是处理屏蔽的首选方法。

我可能会去sudo的路线,限制访问所需的具体命令将您的用户的过程进入盾牌。

虽然cgroups似乎取代了cset / cpusets(正如ewwhite所说),但是我继续使用旧的方法,因为它比较熟悉并且仍然有效。

对于权限问题,我首先使用cset创build了一个内部/ cpusets树,我用sudo chown -R root:myusergroup /cpusets/mytreesudo chmod -R g+rwX /cpusets/mytree解决了我的特殊问题。 之后, myusergroup中的用户可以通过echo $MYPID >> /cpusets/mytree/subtree/tasks在树内移动进程。 不幸的是,如果没有对所有/ cpusets的完全许可,cset似乎无法正常工作 – 我相信每次运行命令时都会尝试重新读取整个/ cpusets目录 – 所以我不得不使用这种手动方法来移动进程。

我并不是说这对大家来说是理想的解决scheme,但是它最适合我的背景和情况。