Предисловие: Я не на 100 процентов знаком с systemd и концепциями unit-файлов, но кое-что прочитал.
Контекст: Я хочу переместить процесс из одного дерева cgroup в другое, в дистрибутиве, работающем под управлением systemd и (не systemd, скажем upstart). Более конкретно, предположим, что дерево cgroup выглядит следующим образом.
В принципе иерархия выглядит так относительно my_root
my_root
|
______ ___________
| |
d11 d12
(P lives here) |
___________
| |
d21 d22
затем P перемещается под d21 или
my_root
|
______ ___________
| |
d11 d12
|
___________
| |
d21 d22
(P lives here now)
Для полноты картины скажем
my_root = /sys/fs/cgroups/cpu,cpuacct/my_root
Давайте поговорим о не-systemd bucket: если я работаю в дистрибутиве, в котором не запущен systemd, я могу просто передать pid из P1
в cgroups.procs
из d21
, и тогда мой процесс будет перемещен в эту cgroup.
А теперь systemd
вариант использования, и вот в чем я не уверен. Допустим, я делаю то же самое, что и выше. Могут произойти две вещи.
- Процесс перемещается туда и там остается.
- Первоначально процесс перемещается туда, но через некоторое время он либо возвращается назад, либо переходит в корневую cgroup для данного конкретного контроллера.
Я хочу избежать последнего. По сути, я думаю, что когда я указываю файл юнита для своего приложения, я хочу стать владельцем cgroup, в которой запущено приложение, например, приложение становится владельцем my_root
cgroup, чтобы systemd не мешал перемещению процесса.
Теперь перейдем к многокомпонентному вопросу.
- Действительно ли systemd удалит процесс из cgroup, в которую я его переместил?
- Если да, то что мне нужно сделать, чтобы стать владельцем cgroup в файле юнита. Я ищу некоторые конкретные примеры файлов юнитов.
ресурс:https://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/