Em vez disso, apenas dê permissão restrita ao usuário para executar esse script, por exemplo:
bob ALL=(root) NOPASSWD: /usr/local/bin/cset.sh
Remova NOPASSWD:
se você quiser que o usuário autentique com sua senha.
Eu tenho jogado com o cset para definir a afinidade da CPU para os processos em execução. Eu estou recriando a função "escudo" embutida manualmente com set e proc, para adicionar alguns subconjuntos para threads específicos do meu aplicativo. Eu tenho um script bash que está chamando cset para criar os conjuntos e mover os segmentos corretos para os conjuntos corretos. Funciona quando executado com sudo.
Agora eu gostaria de tornar este script executável por outro usuário, que não tem poderes sudo. Eu confio neste usuário o suficiente para ser responsável com cset, mas não quero abrir os amplos poderes do root.
Eu pensei que CAP_SYS_NICE - que é necessário para o sched_setaffinity, que eu suponho que o cset deva usar - no script seria suficiente, mas isso não funcionou. Eu tentei estender CAP_SYS_NICE para o programa cset (que é um wrapper fino python para a biblioteca python cset). Sem dados. A saída de cap_to_text em meus scripts CAP_SYS_NICE'd é "= cap_ipc_lock, cap_sys_nice, cap_sys_resource + eip" (tem ipc_lock e sys_resource por outras razões; acho que apenas sys_nice é relevante).
Alguma idéia?
Eu sempre pensei em cset como uma ferramenta SuSE. Eu usei no RHEL no EL5, mas com EL6, cgroups é o método preferido para lidar com a blindagem.
Eu provavelmente usaria a rota sudo, limitando o acesso aos comandos específicos necessários para colocar os processos de seus usuários no escudo.
Enquanto o cgroups parece superceder os cset / cpusets (como disse o ewwhite), eu continuei com o método antigo de qualquer forma porque era mais familiar e ainda funciona.
Para o problema de permissão, meu problema específico foi resolvido usando primeiro o cset para criar uma árvore dentro de / cpusets com os quais eu sudo chown -R root:myusergroup /cpusets/mytree
e sudo chmod -R g+rwX /cpusets/mytree
. Depois disso, os usuários em myusergroup
poderão mover os processos dentro da árvore em echo $MYPID >> /cpusets/mytree/subtree/tasks
. Infelizmente o cset parece não funcionar sem permissão total em todos os / cpusets - eu acredito que ele tente reler o diretório / cpusets toda vez que você executar um comando - então eu tive que recorrer a este método manual de mover processos.
Não estou dizendo que essa é a solução ideal para todos, mas funcionou melhor com meu histórico e situação.