首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sudo用户可以使用sched_setscheduler SCHED_RR而根用户不能使用?

问为什么sudo用户可以使用sched_setscheduler SCHED_RR而根用户不能使用?
EN

Unix & Linux用户
提问于 2015-06-05 12:58:34
回答 2查看 8.1K关注 0票数 4

我正在Raspberry Pi 2上运行Arch。

我有一个用户空间程序,它使用戈登的wiringPi库,特别是试图为当前进程设置最高优先级的piHiPri()函数 (使用sched_setscheduler和SCHED_RR模式)。此函数需要超级用户特权。

在安装Arch时,根用户是默认用户,因此我创建了一个名为builder的用户,我通过visudo将其添加到sudoers中。

我的问题是:当我与root用户一起执行程序时,sched_setscheduler函数返回“不允许的操作”(从errno获得)。

如果我在做builder时执行它,就会得到“拒绝的权限”。

但是,如果我在sudo myProgram中执行它,而我是builder,那么一切都很好,并且我可以看到top命令改变了优先级。

我认为root用户可能没有UID 0,所以我使用id -u root进行了检查,但返回0。

ls -l myProgramm给了-rwxr-xr-x 1 root root。我还尝试用chmod +s myProgramm设置SUID,但没有成功。

知道如何使我的程序通过root可执行吗?

编辑:

正如吉尔斯建议的那样,我运行了ulimit -r,它在任何情况下都返回0(builder和root)。

我将/etc/security/limits.conf中的一行更改为:* - rtprio 0

致:* - rtprio 99

这就像预期的那样影响了ulimit -r的输出:它现在返回99。

然后我再次尝试用root运行我的程序,但是我仍然有相同的Operation not permitted错误,现在它不再适用于sudo (与上面相同的Operation not permitted).奇怪!

在调查时,我回到了旧的/etc/security/limits.conf设置。

EN

回答 2

Unix & Linux用户

发布于 2019-04-08 15:22:33

我也被这个问题击中了。在我的例子中,结果是docker守护进程已经重新配置了默认的cgroup。结果,根用户将cgroup片的cpu.rt_runtime_us设置为零。为了设置实时调度程序( RR或FIFO),您需要分配一些CPU时间。如果您的进程没有它(当cpu.rt_runtime_us为零时),您将获得“拒绝权限”。

有关与此问题相关的cgroup和docker的更多详细信息,请参阅RedHat Bugzilla:https://bugzilla.redhat.com/show_bug.cgi?id=1467919上的错误报告。

票数 3
EN

Unix & Linux用户

发布于 2015-06-06 22:13:10

有一件事可以解释这种区别,那就是如果你的最大实时优先级(ulimit -r)有不同的限制。根不能超过限制,但可以提高限制。检查ulimit -r (或者,在C语言中使用getrlimit(RLIMIT_RTPRIO, …) ),并在必要时在运行程序之前提高限制。

如果这没有帮助,那么它可能是程序中的一个问题,而不是您的系统配置中的问题。在复制问题的小型但独立的源代码。上发布一个堆栈溢出 (编程在Unix & Linux上是非主题的)。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/207762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档