Источник: Moving a Process to a Control Group
Чтобы перенести процесс в контрольную группу, выполните команду cgclassify. Например:
cgclassify -g cpu,memory:group1 1701Синтаксис команды cgclassify:
cgclassify -g subsystems:path_to_cgroup pidlist
Где:
subsystems— список подсистем, разделённых запятыми, или*, если процесс нужно запустить в иерархиях, связанных со всеми доступными подсистемами. Если контрольные группы с одинаковыми именами существуют в нескольких иерархиях, параметр-gпереместит процессы в каждую из этих групп. Убедитесь, что контрольная группа существует в каждой иерархии, подсистема которой указана в этой команде.path_to_cgroup— путь к контрольной группе внутри её иерархий.pidlist— список идентификаторов процессов (PID), разделённых пробелами.
Если параметр -g не указан, cgclassify автоматически просматривает файл /etc/cgrules.conf (см. раздел «Служба cgred») и использует первую подходящую строку конфигурации. По этой строке cgclassify определяет иерархии и контрольные группы, в которые нужно переместить процесс. Для успешного переноса целевые иерархии должны существовать. Подсистемы, указанные в /etc/cgrules.conf, также должны быть правильно настроены для соответствующих иерархий в /etc/cgconfig.conf.
Параметр --sticky можно указать перед pidlist, чтобы все дочерние процессы оставались в той же контрольной группе. Если этот параметр не задан и служба cgred запущена, дочерние процессы распределяются по контрольным группам на основании настроек из /etc/cgrules.conf. Родительский процесс при этом остаётся в контрольной группе, в которой он был первоначально запущен.
С помощью cgclassify можно одновременно переместить несколько процессов. Например, следующая команда перемещает процессы с PID 1701 и 1138 в контрольную группу group1/:
cgclassify -g cpu,memory:group1 1701 1138Обратите внимание: переносимые PID разделяются пробелами, а указанные группы должны находиться в разных иерархиях.
Чтобы переместить процесс в контрольную группу напрямую, запишите его PID в файл tasks этой группы. Например, чтобы переместить процесс с PID 1701 в контрольную группу /cgroup/cpu_and_mem/group1/, выполните:
echo 1701 > /cgroup/cpu_and_mem/group1/tasksCgred — это служба, запускающая cgrulesengd и перемещающая задачи в контрольные группы в соответствии с параметрами из файла /etc/cgrules.conf. Записи в /etc/cgrules.conf могут иметь одну из двух форм:
user subsystems control\group
user:command subsystems control\group
Замените user именем пользователя или именем группы с префиксом @. Вместо subsystems укажите список имён подсистем, разделённых запятыми. control_group обозначает путь к контрольной группе, а command — имя процесса или полный путь к команде процесса.
Например:
maria devices /usergroup/staff
Эта запись указывает, что все процессы пользователя maria получают доступ к подсистеме devices в соответствии с параметрами контрольной группы /usergroup/staff. Чтобы связать определённые команды с определёнными контрольными группами, добавьте параметр command:
maria:ftp devices /usergroup/staff/ftp
Теперь эта запись указывает, что, когда пользователь maria выполняет команду ftp, процесс автоматически перемещается в контрольную группу /usergroup/staff/ftp иерархии, содержащей подсистему devices. Однако демон перемещает процесс в контрольную группу только после выполнения соответствующего условия. Поэтому процесс ftp может некоторое время работать не в той группе. Кроме того, если за это время процесс быстро создаст дочерние процессы, они могут не быть перемещены.
В записях файла /etc/cgrules.conf можно использовать следующие дополнительные обозначения:
@— обозначает группу вместо отдельного пользователя. Например,@adminsозначает всех пользователей группыadmins.*— означает «все». Например,*в полеsubsystemобозначает все смонтированные подсистемы.%— обозначает тот же элемент, что и в строке выше.
Например, записи в /etc/cgrules.conf могут выглядеть так:
@adminstaff devices /admingroup
@labstaff % %
Эта конфигурация гарантирует, что процессы пользователей из групп adminstaff и labstaff получают доступ к подсистеме devices в соответствии с ограничениями контрольной группы admingroup.
Правила из /etc/cgrules.conf можно связать с шаблонами, настроенными в файле /etc/cgconfig.conf или в конфигурационных файлах каталога /etc/cgconfig.d/. Это позволяет гибко назначать и создавать контрольные группы.
Например, добавьте в /etc/cgconfig.conf следующий шаблон:
template users/%g/%u {
cpuacct{
}
cpu {
cpu.shares = "1000";
}
}
Затем используйте шаблон users/%g/%u в третьем поле записи /etc/cgrules.conf:
peter:ftp cpu users/%g/%u
Переменные %g и %u автоматически заменяются именами группы и пользователя, которым принадлежит процесс ftp. Если процесс принадлежит пользователю peter из группы adminstaff, приведённый выше путь преобразуется в users/adminstaff/peter. Затем служба cgred ищет этот каталог и, если он не существует, создаёт его и назначает процесс файлу users/adminstaff/peter/tasks. Правила шаблонов применяются только к определениям template в конфигурационных файлах. Поэтому, даже если в /etc/cgconfig.conf определена группа group users/adminstaff/peter, она будет проигнорирована в пользу шаблона template users/%g/%u.
В путях к контрольным группам внутри шаблонов можно использовать и другие переменные:
%u— заменяется именем пользователя, которому принадлежит текущий процесс. Если определить имя не удаётся, используется UID.%U— заменяется UID пользователя, которому принадлежит текущий процесс.%g— заменяется именем группы пользователя, которому принадлежит текущий процесс. Если определить имя не удаётся, используется GID.%G— заменяется GID группы, которой принадлежит текущий процесс.%p— заменяется именем текущего процесса. Если определить имя не удаётся, используется PID.%P— заменяется PID текущего процесса.