From b044c9adaedc1c7eba99c50fa5c9e61c2ceb517d Mon Sep 17 00:00:00 2001 From: Aljosha Friemann Date: Sun, 8 Jan 2017 02:38:53 +0100 Subject: [PATCH] version without cgm and automatic child process removal --- README.rst | 19 +++---- user-session-manager/finish | 3 -- user-session-manager/run | 5 -- user-session-manager/usm | 99 ------------------------------------- user-session/control/t | 2 + user-session/finish | 4 +- user-session/run | 16 +++--- 7 files changed, 20 insertions(+), 128 deletions(-) delete mode 100755 user-session-manager/finish delete mode 100755 user-session-manager/run delete mode 100755 user-session-manager/usm create mode 100755 user-session/control/t diff --git a/README.rst b/README.rst index 1217ecf..0beee6c 100644 --- a/README.rst +++ b/README.rst @@ -5,6 +5,11 @@ This service will start a runsvdir process for a given user that will manage run $HOME/.local/service +requirements +------------ + +* libcgroup-utils - The session uses cgroups to limit available pids. + user-sessions ------------- @@ -17,7 +22,7 @@ and services in *~/.local/service*. Runit should now automatically run all servi To control the services, use the provided usv script or add a function to your shell rc:: usv () { - SVDIR=~/.local/service sv + SVDIR=~/.local/service sv $@ } now run (assuming you have the user-session running):: @@ -29,8 +34,7 @@ now run (assuming you have the user-session running):: $ usv stop aria2c ok: down: aria2c: 1s, normally up -the user-session is run in a cgroup, currently with max PIDs of 50. The cgroup is also used to kill child processes in -case the user-session is killed:: +Stopping the user-session should also stop all child services:: $ usv status aria2c ok: run: aria2c: (pid 12237) 1061s @@ -42,12 +46,3 @@ case the user-session is killed:: $ ps aux | grep aria2c admin 14458 0.0 0.0 10756 2192 pts/6 S+ 00:12 0:00 grep aria2c -user-session-manager --------------------- - -The user-session-manager service will automatically create/remove user-sessions for logged in users:: - - $ cp -r user-session /etc/sv/user-session - $ cp -r user-session-manager /etc/sv/user-session-manager - $ ln -s /etc/sv/user-session-manager /var/service/user-session-manager - diff --git a/user-session-manager/finish b/user-session-manager/finish deleted file mode 100755 index 3283501..0000000 --- a/user-session-manager/finish +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -exec ./usm remove all diff --git a/user-session-manager/run b/user-session-manager/run deleted file mode 100755 index 4120f8b..0000000 --- a/user-session-manager/run +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -exec 2>&1 -exec ./usm watch - diff --git a/user-session-manager/usm b/user-session-manager/usm deleted file mode 100755 index 1e64d89..0000000 --- a/user-session-manager/usm +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh - -list_users () { - who -u | cut -d' ' -f1 | uniq -} - -remove () { - [ -d /etc/sv/"$1" ] && rm -rf /etc/sv/"$1" -} - -create () { - [ -d /etc/sv/"$1" ] || cp -r /etc/sv/user-session /etc/sv/"$1" -} - -disable () { - [ -h /var/service/"$1" ] && rm /var/service/"$1" -} - -enable () { - [ -h /var/service/"$1" ] || ln -s /etc/sv/"$1" /var/service/"$1" -} - -stop () { - sv status "$1" && sv stop "$1" -} - -start () { - sv status "$1" || sv start "$1" -} - -create_session () { - create "$1" && enable "$1" && start "$1" -} - -remove_session () { - stop "$1"; disable "$1"; remove "$1" -} - -list_sessions () { - for SERVICE in $(find /etc/sv -name "user.*"); do - echo "$(basename $SERVICE)" - done -} - -create_sessions () { - for user in $(who -u | cut -d' ' -f1 | uniq); do - local SERVICE="user.$user" - create_session "$SERVICE" - done -} - -remove_sessions () { - for SERVICE in $(list_sessions); do - remove_session "$SERVICE" - done -} - -remove_gone () { - for SERVICE in $(list_sessions); do - local USER="${SERVICE##*.}" - list_users | grep -vq "^$USER" && remove_session "$SERVICE" - done -} - -watch_sessions () { - while true; do - create_sessions && remove_gone && sleep 3 - done -} - -case "$1" in - watch) - watch_sessions - ;; - list) - list_sessions - ;; - create) - case "$2" in - all) - create_sessions - ;; - *) - [ -z "$2" ] || create_session "$2" - ;; - esac - ;; - remove) - case "$2" in - all) - remove_sessions - ;; - *) - [ -z "$2" ] || remove_session "$2" - ;; - esac - ;; -esac - diff --git a/user-session/control/t b/user-session/control/t new file mode 100755 index 0000000..0d7f50a --- /dev/null +++ b/user-session/control/t @@ -0,0 +1,2 @@ +#!/bin/sh +exec sv -v h . diff --git a/user-session/finish b/user-session/finish index 8a3b0ad..cebb8a3 100755 --- a/user-session/finish +++ b/user-session/finish @@ -1,6 +1,6 @@ #!/bin/sh -SVNAME="$(basename $0)" +SVNAME="$(realpath $0 | cut -d/ -f4)" SVUSER="${SVNAME##*.}" -cgm gettasksrecursive pids "$SVUSER" | xargs kill +cgdelete -g "pids:users/${SVUSER}/runit" diff --git a/user-session/run b/user-session/run index c3e3596..43a955b 100755 --- a/user-session/run +++ b/user-session/run @@ -1,13 +1,15 @@ #!/bin/sh SVNAME="$(realpath $0 | cut -d/ -f4)" -SVUSER=${SVNAME##*.} +SVUSER="${SVNAME##*.}" +SVHOME="$(eval "echo ~$SVUSER")/.local/service" -who -u | grep -q "^$SVUSER" || exit 1 +who | grep -q "^${SVUSER}" || exit 1 +[ -d "$SVHOME" ] || exit 1 -cgm create all "$SVUSER" -cgm removeonempty all "$SVUSER" -cgm setvalue pids "$SVUSER" pids.max 50 +CGROUP="users/${SVUSER}/runit" -exec 2>&1 -exec cgexec -g "*:${SVUSER}" --sticky chpst -u "$SVUSER" -P runsvdir -P /home/"$SVUSER"/.local/service +cgcreate -g "pids:$CGROUP" +cgset -r pids.max=100 "$CGROUP" + +exec cgexec -g "pids:$CGROUP" --sticky -- chpst -u "$SVUSER" runsvdir "$SVHOME"