如何检查sched_setscheduler()的权限? 我有一个C++应用程序,调用 SeDeStStayStor(PID,SHIDEHR RR,…)< /C>
应用程序在具有根权限的Linux上运行。这个电话通常是有效的。仅在一个特定的虚拟专用服务器中,它会因如何检查sched_setscheduler()的权限? 我有一个C++应用程序,调用 SeDeStStayStor(PID,SHIDEHR RR,…)< /C>,c++,linux,permissions,scheduler,vps,C++,Linux,Permissions,Scheduler,Vps,应用程序在具有根权限的Linux上运行。这个电话通常是有效的。仅在一个特定的虚拟专用服务器中,它会因EPERM而失败 有没有人见过这样一种情况:具有根权限的进程不能这样做 如何检查进程是否具有避免调用所需的所有权限 更新: 我发现它唯一的基于Virtuozzo的虚拟服务器就是发生这种情况的地方。使用例如KVM的虚拟机是正常的。您是否试图更改应用程序本身或系统中其他进程的优先级 手册页man 2 sched_setscheduler在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的
EPERM
而失败
有没有人见过这样一种情况:具有根权限的进程不能这样做
如何检查进程是否具有避免调用所需的所有权限
更新:
我发现它唯一的基于Virtuozzo的虚拟服务器就是发生这种情况的地方。使用例如KVM的虚拟机是正常的。您是否试图更改应用程序本身或系统中其他进程的优先级 手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂
可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置
我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。您是在尝试更改应用程序本身还是系统中其他进程的优先级 手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂
可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置
我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。您是在尝试更改应用程序本身还是系统中其他进程的优先级 手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂
可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置
我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。您是在尝试更改应用程序本身还是系统中其他进程的优先级 手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂
可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置
我认为,要检测这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。不确定您正在运行哪个内核,但这个问题已经讨论过了。解决办法是。问题在于
CONFIG_SCHED_AUTOGROUP
;它不支持SCHED_RR
或SCHED_FIFO
。然而,如果你像我一样,这可能仍然不能解决你的问题。问题在于kernel/sched/core.c
(kernel/sched.c
早期内核中的kernel/sched.c
中的此代码(此3.4.47代码包含上述补丁):
在我的例子中,一个系统工作,一个系统不工作,这取决于!task\u group\u是自动组(task\u group(p))
子句(两个系统运行完全相同的内核)。在出现故障的系统中,该子句的计算结果为1(即,它不在自动组中)。该补丁最早出现在3.1.10内核中。听起来你的问题和我的一样,因为只有一个系统出了故障。这指向一个配置问题。我没有发现启用的/proc/sys/kernel/sched_autogroup_
解决了这个问题;我在启用自动组的情况下遇到了上述问题,当我禁用它时,遇到了另一个问题(rt\u runtime
在一个系统上为零,在另一个系统上为950000000),即使/sys/fs/cgroup/cpu,cpuacct/cpu.rt\u runtime\u us
(我认为这是一个直接链接,或者至少与rt\u runtime
相关)在这两种情况下都是950000000
因此,看起来有一个任务被分配给自动组并成功,而有一个任务未被分配并失败,因为它没有运行时
更新:
我确实找到了一种解决方案,我在中讨论过。如果我更改进程的cgroup映射,使其位于根cgroup中,那么问题就解决了。通过在
/etc/systemd/system.conf
中将DefaultController
设置为null,可以永久更改此设置 不确定您正在运行哪个内核,但讨论了这个问题。解决办法是。问题在于CONFIG_SCHED_AUTOGROUP
;它不支持SCHED_RR
或SCHED_FIFO
。然而,如果你像我一样,这可能仍然不能解决你的问题。问题在于kernel/sched/core.c
(kernel/sched.c
早期内核中的kernel/sched.c
中的此代码(此3.4.47代码包含上述补丁):
在我的例子中,一个系统工作,一个系统不工作,这取决于!task\u group\u是自动组(task\u group(p))
子句(两个系统运行完全相同的内核)。在出现故障的系统中,该子句的计算结果为1(即,它不在
/*
* Do not allow realtime tasks into groups that have no runtime
* assigned.
*/
if (rt_bandwidth_enabled() && rt_policy(policy) &&
task_group(p)->rt_bandwidth.rt_runtime == 0 &&
!task_group_is_autogroup(task_group(p))) {
task_rq_unlock(rq, p, &flags);
return -EPERM;
}