Групповое планирование Linux для пользователя, не применяемого к процессу setuid-ed

StackOverflow https://stackoverflow.com/questions/1920952

Вопрос

В ядре Linux 2.6.28-11 я использую setpriority для изменения количества процессорного времени, получаемого различными пользовательскими процессами.Пользователь 1 должен получить вдвое большую мощность процессора, чем пользователь 2.Используя setpriority в Linux, я присвоил пользователю 2 более низкий приоритет (более высокий с точки зрения хороших значений).Когда я запускаю точно такую же программу через оболочку с загруженным компьютером, выполнение пользователя 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())))

Или, конечно, вы могли бы установить приоритет другого процесса с соответствующими привилегиями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top