서비스가 다시 시작될 때 위임 장치의 cgroup.subtree_control이 재설정되는 것을 방지하는 방법

서비스가 다시 시작될 때 위임 장치의 cgroup.subtree_control이 재설정되는 것을 방지하는 방법

systemd v250 환경에서는 서비스를 다시 시작하면 cgroup.subtree_control재설정됩니다.

값을 수정하면 cgroup.subtree_control서비스를 다시 시작할 때 systemd는 값을 덮어쓰려고 시도합니다 cgroup.subtree_control. 예를 들어, cpusubtree_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

문제를 재현하는 단계

  1. systemctl이 DelegateTest.service를 시작합니다.
  2. 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
  1. systemctl stop DelegateTest.service
  2. 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
  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.
  1. 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

관련 정보