systemd v250環境では、サービスを再起動するとcgroup.subtree_control
リセットされます。
値を変更すると、cgroup.subtree_control
サービスを再起動すると、systemdは値を上書きしようとしますcgroup.subtree_control
。たとえば、cpu
subtree_controlにコントローラを追加すると、サービスが再起動すると、systemdはそれをsubtree_controlから削除します。この時点でサブディレクトリを作成して再起動すると、サブグループにプロセスがあると起動が失敗します。エラーは次のとおりです。
Control process exited, code=exited, status=219/CGROUP
...
Unit process 543222 (xxx) remains running after unit stoped.
....
subtree_controlをオーバーライドすると失敗するようです。
cgroup.subtree_control
委任が有効になったら自分で管理したいです。
私はsystemdがそれを修正せず、cgroup.subtree_control
サービスが再起動されたときに委任されたサービスをリセットしないことを望みます。
関連文書
ユニットファイル:
[Unit]
Description=DelegateTest
[Service]
Type=simple
TimeoutSec=60s
KillMode=process
ExecStartPre=/bin/bash /test/start_pre.sh
ExecStart=/bin/bash /test/loader.sh
ExecStop=/bin/kill $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Delegate=yes
/test/start_pre.sh:
echo "start_pre"
/test/loader.sh
echo "executing"
CGROUP=$(cat /proc/$$/cgroup)
CGROUP_PATH=/sys/fs/cgroup${CGROUP#*::}
if [[ ! -d ${CGROUP_PATH}/job ]]; then
mkdir ${CGROUP_PATH}/job
fi
echo $$ > ${CGROUP_PATH}/job/cgroup.procs
echo "+cpu" > ${CGROUP_PATH}/cgroup.subtree_control
ping 127.0.0.1 > /dev/null
問題を再現する手順
- systemctl が DelegateTest.service を起動します。
- systemctl 状態 DelegateTest.service
Loaded: loaded (/usr/lib/systemd/system/DelegateTest.service; static)
Active: active (running) since Thu 2022-07-21 09:58:31 CST; 1s ago
Process: 541635 ExecStartPre=/bin/bash /test/start_pre.sh (code=exited, status=0/SUCCESS)
Main PID: 541636 (bash)
Tasks: 2 (limit: 23196)
Memory: 660.0K
CPU: 11ms
CGroup: /system.slice/DelegateTest.service
└─job
├─541636 /bin/bash /test/loader.sh
└─541639 ping 127.0.0.1
- systemctl stop DelegateTest.service
- systemctl 状態 DelegateTest.service
Loaded: loaded (/usr/lib/systemd/system/DelegateTest.service; static)
Active: inactive (dead) since Thu 2022-07-21 09:58:36 CST; 981ms ago
Process: 541635 ExecStartPre=/bin/bash /test/start_pre.sh (code=exited, status=0/SUCCESS)
Process: 541636 ExecStart=/bin/bash /test/loader.sh (code=killed, signal=TERM)
Process: 541644 ExecStop=/bin/kill $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 541636 (code=killed, signal=TERM)
Tasks: 1 (limit: 23196)
Memory: 300.0K
CPU: 13ms
CGroup: /system.slice/DelegateTest.service
└─job
└─541639 ping 127.0.0.1
- systemctl が DelegateTest.service を起動します。
Job for DelegateTest.service failed because the control process exited with error code.
See "systemctl status DelegateTest.service" and "journalctl -xeu DelegateTest.service" for details.
- systemctl 状態 DelegateTest.service
× DelegateTest.service - DelegateTest
Loaded: loaded (/usr/lib/systemd/system/DelegateTest.service; static)
Active: failed (Result: exit-code) since Thu 2022-07-21 09:58:53 CST; 1s ago
Process: 541649 ExecStartPre=/bin/bash /test/start_pre.sh (code=exited, status=219/CGROUP)
Tasks: 1 (limit: 23196)
Memory: 300.0K
CPU: 84us
CGroup: /system.slice/DelegateTest.service
└─job
└─541639 ping 127.0.0.1
関連質問:
https://github.com/systemd/systemd/issues/24064 https://github.com/systemd/systemd/issues/20026 https://github.com/systemd/systemd/issues/18293 https://github.com/systemd/systemd/pull/9119 https://github.com/systemd/systemd/issues/8645 https://github.com/systemd/systemd/issues/18104