Nimbin[12]?Mirrors & Forks / jhalfs / commits / cff36a7

jhalfs git · trunk

jhalfs LFS build automation (mirror)

lfs mirror bash · first commit 2005-09-11 · last commit 2024-02-13 (2 years ago) · synced 3 days ago · upstream: git.linuxfromscratch.org/jhalfs

Python 78.4% Shell 19.8% Makefile 1.8%
git clone https://git.christianimmanuel.de/mirrors-forks/jhalfs.gitwget https://git.christianimmanuel.de/mirrors-forks/jhalfs/archive/jhalfs.tar.gz

Fix session management in run-in-cgroup.sh

Pierre Labastie · 2023-11-16 13:37 · cff36a77ba586d41f2e62c1f5eadd7625621aad1

Still WIP but some progress...
When moving a shell to a cgroup not associated with a session,
then subsequent calls to pam_systemd or pam_elogind create
a new session, and a new cgroup for that session, so that the
cgroup of the calling process is not used (this is a problem
with both systemd and elogind). For systemd, the problem can be
solved by passing --slice <user slice> to systemd-run. For elogind,
we need to first move the shell to a non session cgroup, then run
sudo so that a new session is created, then pass the cpuset to that
session's cgroup. Hopefully, if neither systemd nor elgind is used,
then the former solution should work (to be tested!!!).
 common/run-in-cgroup.sh | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/common/run-in-cgroup.sh b/common/run-in-cgroup.sh
index 9891d72..8794cd4 100755
--- a/common/run-in-cgroup.sh
+++ b/common/run-in-cgroup.sh
@@ -7,13 +7,29 @@ fi
 
 set +e
 
-if type systemd-run >/dev/null 2>&1 ; then
-	sudo systemd-run -G --pty -d --uid=$(whoami) -p AllowedCPUs="$CPUSPEC" "$@"
-else
-	sudo mkdir /sys/fs/cgroup/jhalfs
-	sudo sh -c "echo +cpuset > /sys/fs/cgroup/cgroup.subtree_control"
-	sudo sh -c "echo \"$CPUSPEC\" > /sys/fs/cgroup/jhalfs/cpuset.cpus"
-	(sudo sh -c "echo $BASHPID > /sys/fs/cgroup/jhalfs/cgroup.procs" &&
-		exec "$@")
-	sudo rmdir /sys/fs/cgroup/jhalfs
+if type systemd-run >/dev/null 2>&1 ; then # systemd
+   sudo systemd-run -G --pty -d --uid=$(whoami)    \
+                    -p AllowedCPUs="$CPUSPEC"      \
+                    --slice "user-$(whoami).slice" \
+                    "$@"
+elif type loginctl >/dev/null 2>&1 ; then #elogind
+   sudo mkdir /sys/fs/cgroup/jhalfs
+   sudo sh -c "echo +cpuset > /sys/fs/cgroup/cgroup.subtree_control"
+   (
+      sudo sh -c "echo $BASHPID > /sys/fs/cgroup/jhalfs/cgroup.procs"
+      sudo -u $(whoami) sh <<EOF
+         SESS_CGROUP=/sys/fs/cgroup/\$XDG_SESSION_ID
+         sudo sh -c "echo \\"$CPUSPEC\\" > \$SESS_CGROUP/cpuset.cpus"
+         (sudo sh -c "echo \$BASHPID > \$SESS_CGROUP/cgroup.procs" &&
+            exec $@)
+EOF
+   )
+   sudo rmdir /sys/fs/cgroup/jhalfs
+else # no session manager
+   sudo mkdir /sys/fs/cgroup/jhalfs
+   sudo sh -c "echo +cpuset > /sys/fs/cgroup/cgroup.subtree_control"
+   sudo sh -c "echo \"$CPUSPEC\" > /sys/fs/cgroup/jhalfs/cpuset.cpus"
+   (sudo sh -c "echo $BASHPID > /sys/fs/cgroup/jhalfs/cgroup.procs" &&
+      exec "$@")
+   sudo rmdir /sys/fs/cgroup/jhalfs
 fi