Планирование групп Linux для пользователя, не применяемого к процессу setuid-ed - PullRequest
1 голос
/ 17 декабря 2009

В ядре Linux 2.6.28-11 я использую setpriority для смещения количества процессорного времени, которое получают различные пользовательские процессы. Пользователь 1 должен получить удвоенную мощность процессора пользователя 2. Используя приоритет Linux, я назначил пользователю 2 более низкий приоритет (более высокий с точки зрения хороших значений). Когда я запускаю ту же самую программу через оболочку с загруженным компьютером, выполнение пользователя 2 занимает в два раза больше времени пользователя 1. Однако, если я запускаю программу от имени пользователя root, а затем использую setuid, seteuid, setgid, setegid и setgroups, чтобы стать пользователем 2 (снова компьютер загружается, и точно такая же программа запускается пользователем 1 таким же образом) программы занимают одинаковое количество времени для выполнения; Процесс пользователя 2 был запланирован не меньше, чем у пользователя 1. Как я могу обойти это? Нужно ли устанавливать что-либо еще, чтобы планировщик осознавал, что процесс теперь является частью другого пользователя?

Запускаемая программа на языке Python.

1 Ответ

2 голосов
/ 18 декабря 2009

Правильно, это спроектированное поведение, даже если это не то, что вы хотите. Вы можете обновить свой собственный приоритет, чтобы он соответствовал тому, что вы должны были унаследовать, если вы были запущены нормально:

/* 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())))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...