Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未应用于已设置UID进程的用户的Linux组调度_Python_Linux_Scheduling_Scheduler_Setuid - Fatal编程技术网

Python 未应用于已设置UID进程的用户的Linux组调度

Python 未应用于已设置UID进程的用户的Linux组调度,python,linux,scheduling,scheduler,setuid,Python,Linux,Scheduling,Scheduler,Setuid,在2.6.28-11 Linux内核上,我使用setpriority来偏移不同用户进程接收的cpu时间。用户1的CPU功率是用户2的两倍。使用Linux的setpriority,我为用户2分配了一个较低的优先级(在nice值方面更高)。当我在计算机加载的情况下通过shell运行完全相同的程序时,用户2的执行时间是用户1的两倍。但是,如果我以root用户身份运行该程序,然后使用setuid、seteuid、setgid、setegid和setgroups成为用户2(再次加载计算机,用户1以相同的方

在2.6.28-11 Linux内核上,我使用setpriority来偏移不同用户进程接收的cpu时间。用户1的CPU功率是用户2的两倍。使用Linux的setpriority,我为用户2分配了一个较低的优先级(在nice值方面更高)。当我在计算机加载的情况下通过shell运行完全相同的程序时,用户2的执行时间是用户1的两倍。但是,如果我以root用户身份运行该程序,然后使用setuid、seteuid、setgid、setegid和setgroups成为用户2(再次加载计算机,用户1以相同的方式运行完全相同的程序),则程序执行所需的时间完全相同;计划的用户2进程不少于用户1的进程。我怎样才能避开这件事?我是否需要为调度器设置任何其他设置,以实现该进程现在是另一个用户的一部分


正在运行的程序是用Python编写的。

对,这是设计好的行为,即使它不是您想要的。如果正常启动,您可以更新自己的优先级以匹配您应该继承的优先级:

/* C */
#include <sys/resource.h>
int proc_prio = getpriority(PRIO_PROCESS, getpid()),
    pgrp_prio = getpriority(PRIO_PGRP, getpgrp()),
    user_prio = getpriority(PRIO_USER, getuid());
setpriority(PRIO_PROCESS, getpid(),
    proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio
                                                  : pgrp_prio
                          : proc_prio < user_prio ? user_prio
                                                  : proc_prio);

# Python
import ctypes
import os
PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2
libc = ctypes.CDLL('libc.so.6')
libc.setpriority(PRIO_PROCESS, os.getpid(),
    max(libc.getpriority(PRIO_PROCESS, os.getpid()),
        libc.getpriority(PRIO_PGRP, os.getpgrp()),
        libc.getpriority(PRIO_USER, os.getuid())))
/*C*/
#包括
int proc_prio=getpriority(prio_进程,getpid()),
pgrp_prio=getpriority(prio_pgrp,getpgrp()),
user_prio=getpriority(prio_user,getuid());
setpriority(PRIO_进程,getpid(),
proc_prio

当然,您也可以使用适当的权限确定另一个进程的优先级。

谢谢您的澄清。你有没有关于Linux如何处理和优先顺序的好的阅读材料?考虑到上面的解决方案,它确实起作用,如果用户1的所有进程都来自设置为uid-ed的fork-ed根进程,那么似乎不可能确保它们只占用x%的cpu。这是真的吗?没有任何好的阅读材料,但是
setuid
检查的唯一问题是“我是root*吗?目标UID的进程是否少于
RLIMIT\u NPROC
进程?”。未检查或触及其他资源限制和优先级。*(实际上检查是”除非LSM禁止,否则我是否有
CAP_SETUID
并且如果我实际更改真实UID,目标是否有少于
RLIMIT_NPROC
的进程,或者指定的UID是否等于当前真实UID或保存的UID?”)在某种程度上,你可以观察netlink连接器的
PROC\u EVENT\u UID
事件来应用这些修复,但我认为你真正想要的是基于UID的cpusets和基于cgroup的调度。我已经按照你的建议,通过netlink使用process events连接器实现了我想要的系统。当我发现有可靠的在CFS(完全公平调度程序)中的ser组调度,我认为它值得进一步检查。我一定会检查基于cgroup的调度。再次感谢。