2.9. Iniciando um Processo em um Grupo de Controle
Importante
Alguns subsistemas possuem parâmetros obrigatórios que devem ser definidos antes que você possa mover uma tarefa em um cgroup que usa quaisquer desses subsistemas. Por exemplo, antes de você mover uma tarefa em um cgroup que usa o subsistema
cpuset
, os parâmetros cpuset.cpus
e cpuset.mems
devem ser definidos para esse cgroup.
Os exemplos nesta seção ilustram a sintáxe correta para o comando, mas somente funcionam em sistemas cujos parâmetros obrigatórios relevantes foram definidos para qualquer controlador usado nestes exemplos. Se você já não houver configurado os controladores relevantes, você não conseguirá copiar os comandos de exemplo diretamente a partir desta seção e esperar que eles funcionem em seu sistema.
Consulte a Seção 3.10, “Recursos Adicionais” para uma descrição de qual os parâmetros são mandatórios para os subsistemas dados.
Inicie processos em um cgroup rodando o comando
cgexec
. Por exemplo, este comando inicia o navegador lynx dentro do cgroup group1
, sujeito às limitações impostas nesse grupo pelo subsistema cpu
:
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
A sintaxe para o
cgexec
is: cgexec -g
subsystems:path_to_cgroup command arguments
, onde:
- subsystems é uma lista de subsistemas separada por vírgulas, ou
*
para iniciar o processo nas hierarquias associadas com todos os subsistemas disponíveis. Note que, como acontece com ocgset
descrito na Seção 2.7, “Definindo Parâmetros”, se os cgroups do mesmo nome existem em múltiplas hierarquias, a opção-g
cria processos em cada um desses grupos. Certifique-se que o cgroup existe dentro de cada das hierarquias cujos subsistemas você especifica aqui. - path_to_cgroup é o caminho para o cgroup relativo à hierarquia.
- command é o comando para executar
- arguments são quaisquer argumentos para o comando
Você também pode adicionar a opção
--sticky
antes de command para manter qualquer processo filho no mesmo cgroup. Se você não definir esta opção e o daemon do cgred estiver em execução, os processos filhos serão alocados aos cgroups baseados em configurações encontradas em /etc/cgrules.conf
. O próprio processo, no entanto, ficará no grupo de controle no qual você o iniciou.
Método alternativo
Quando você iniciar um novo processo, ele herda o grupo de seu processo pai. Portanto, um método alternativo para iniciar um processo em um determinado cgroup é mover seu processo shell ao grupo (consulte a Seção 2.8, “Movendo um Processo para um Grupo de Controle”) e então inicie o processo desse shell. Por exemplo:
~]#echo $$ > /cgroup/lab1/group1/tasks
lynx
Note que depois de sair do lynx, seu shell aberto está ainda no cgroup
group1
. Portanto, uma maneira melhor ainda seria:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
2.9.1. Iniciando um Serviço em um Grupo de Controle
Você pode iniciar certos serviços em um cgroup. Os serviços que podem ser iniciados em cgroups devem:
- usar um arquivo
/etc/sysconfig/servicename
- usar a função
daemon()
do/etc/init.d/functions
para iniciar o serviço
Para fazer um serviço iniciar em um cgroup, edite seu arquivo no diretório
/etc/sysconfig
para incluir uma entrada na forma de CGROUP_DAEMON="subsystem:control_group"
onde subsystem é um subsistema associado à hierarquia específica e control_group é um cgroup nesta hierarquia. Por exemplo:
CGROUP_DAEMON="cpuset:daemons/sql"