Agendamento do grupo Linux para o usuário não ser aplicado ao processo de edição setuid
-
20-09-2019 - |
Pergunta
No kernel Linux 2.6.28-11, estou usando o SetPriority para influenciar a quantidade de tempo de CPU que diferentes processos do usuário recebem. O usuário 1 deve receber o dobro da potência da CPU do usuário 2. Usando o setPriority do Linux, atribuí o usuário 2 uma prioridade mais baixa (maior em termos de valores interessantes). Quando executo exatamente o mesmo programa através do shell com o computador sob carga, a execução do usuário 2 leva o dobro do tempo que o Usuário 1. No entanto, se eu executar o programa como root, e depois usar setuid, setEuid, setGid, setEgid e SetGroups para se tornar o usuário 2 (mais uma vez o computador está sob carga com o mesmo programa que está sendo executado pelo usuário 1 da mesma maneira) , os programas levam exatamente a mesma quantidade de tempo para executar; O processo do usuário 2 não estava sendo agendado menos que o usuário 1. Como posso resolver isso? Preciso definir mais alguma coisa para o agendador perceber que o processo agora faz parte de um usuário diferente?
O programa que está sendo executado está em Python.
Solução
Certo, esse é o comportamento projetado, mesmo que não seja o que você deseja. Você pode atualizar sua própria prioridade para corresponder ao que deveria ter herdado, se foi iniciado normalmente:
/* 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, é claro, você pode corrigir a prioridade de outro processo, com privilégios apropriados.