la planification de groupe Linux pour les utilisateurs ne sont pas appliquées au processus setuid-ed

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

Question

Sur le noyau Linux 2.6.28-11, j'utilise setpriority pour polariser la quantité de temps cpu différents processus utilisateur reçoivent. L'utilisateur 1 est de recevoir le double de la puissance du processeur de l'utilisateur 2. A l'aide de setpriority de Linux, j'ai affecté à l'utilisateur 2 une priorité plus faible (plus élevé en termes de belles valeurs). Quand je lance exactement le même programme via le shell avec l'ordinateur sous charge, l'exécution de l'utilisateur 2 prend deux fois plus longtemps que l'utilisateur 1 de. Cependant, si je lance le programme en tant que root, puis utilisez setuid, seteuid, setgid, setegid et setgroups pour devenir utilisateur 2 (encore une fois l'ordinateur est en charge avec le même programme exact en cours d'exécution par l'utilisateur 1 de la même manière) , les programmes prennent exactement la même quantité de temps pour exécuter; Le processus de l'utilisateur 2 n'était pas prévu pas moins que l'utilisateur 1 de. Comment puis-je contourner cela? Ai-je besoin de mettre quoi que ce soit d'autre pour le planificateur de se rendre compte que le processus fait maintenant partie d'un autre utilisateur?

Le programme est en cours d'exécution en Python.

Était-ce utile?

La solution

Droit, c'est le comportement conçu, même si ce n'est pas ce que vous voulez. Vous pouvez mettre à jour votre priorité pour correspondre à ce que vous devriez avoir hérité, si vous étiez commencé normalement:

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

Ou bien sûr, vous pouvez fixer la priorité d'un autre processus, avec les privilèges appropriés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top