--- rc-cgroup.sh 2014-12-23 21:23:03.255976751 +0100 +++ rc-cgroup.sh 2015-02-28 10:17:58.155998729 +0100 @@ -5,48 +5,47 @@ cgroup_find_path() { - local OIFS n name dir result + local ifs="$IFS" name dir DIR [ -n "$1" ] || return 0 - OIFS="$IFS" IFS=":" while read n name dir; do - [ "$name" = "$1" ] && result="$dir" + [ "$name" = "$1" ] && DIR="$dir" done < /proc/1/cgroup - IFS="$OIFS" - echo $result + IFS="$ifs" + echo "$DIR" } cgroup_get_pids() { local p - pids= + PIDS= while read p; do - [ $p -eq $$ ] || pids="${pids} ${p}" - done < /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks - [ -n "$pids" ] + [ $p -eq $$ ] || PIDS="$PIDS $p" + done < /sys/fs/cgroup/openrc/$RC_SVCNAME/tasks + [ -n "$PIDS" ] } -cgroup_running() +cgroup_get_state() { - [ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ] + [ -d "/sys/fs/cgroup/openrc/$RC_SVCNAME" ] } cgroup_set_values() { [ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0 - local controller="$1" h=$(cgroup_find_path "$1") - cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}" - [ -d "$cgroup" ] || mkdir -p "$cgroup" + local ctrl="$1" group head=$(cgroup_find_path "$1") + group="/sys/fs/cgroup/${1}${head}openrc_${RC_SVCNAME}" + [ -d "$group" ] || mkdir -p "$group" set -- $2 local name val - while [ -n "$1" -a "$controller" != "cpuacct" ]; do + while [ -n "$1" -a "$ctrl" != "cpuacct" ]; do case "$1" in - $controller.*) - if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then - veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" - echo $val > "$cgroup/$name" + $ctrl.*) + if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then + veinfo "$RC_SVCNAME: Setting $group/$name to $val" + echo "$val" > "$group/$name" fi name=$1 val= @@ -57,78 +56,60 @@ esac shift done - if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then - veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" - echo $val > "$cgroup/$name" + if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then + veinfo "$RC_SVCNAME: Setting $group/$name to $val" + echo "$val" > "$group/$name" fi - - if [ -f "$cgroup/tasks" ]; then - veinfo "$RC_SVCNAME: adding to $cgroup/tasks" - echo 0 > "$cgroup/tasks" + if [ -f "$group/tasks" ]; then + veinfo "$RC_SVCNAME: Adding to $group/tasks" + echo 0 > "$group/tasks" fi - return 0 } cgroup_add_service() { - # relocate starting process to the top of the cgroup - # it prevents from unwanted inheriting of the user - # cgroups. But may lead to a problems where that inheriting - # is needed. - for d in /sys/fs/cgroup/* ; do - [ -f "${d}"/tasks ] && echo 0 > "${d}"/tasks - done + # FIXME: + # Relocating process to the top of the CGroup to prevent + # unwanted inheriting user CGroup may lead to issue when + # inheriting may be necessary. + if yesno ${rc_cgroup_inherit:-${RC_CGROUP_INHERIT:-Yes}}; then + local dir + for dir in /sys/fs/cgroup/*; do + [ -f "$dir"/tasks ] && echo $$ > "$dir"/tasks + done + fi - openrc_cgroup=/sys/fs/cgroup/openrc - if [ -d "$openrc_cgroup" ]; then - cgroup="$openrc_cgroup/$RC_SVCNAME" - mkdir -p "$cgroup" - [ -f "$cgroup/tasks" ] && echo $$ > "$cgroup/tasks" + local group cgroup=/sys/fs/cgroup/openrc + if [ -d "$cgroup" ]; then + group="$cgroup/$RC_SVCNAME" + mkdir -p "$group" + [ -f "$group/tasks" ] && echo $$ > "$group/tasks" fi } cgroup_set_limits() { - local blkio="${rc_cgroup_blkio:-$RC_CGROUP_BLKIO}" - [ -n "$blkio" ] && cgroup_set_values blkio "$blkio" - - local cpu="${rc_cgroup_cpu:-$RC_CGROUP_CPU}" - [ -n "$cpu" ] && cgroup_set_values cpu "$cpu" - - local cpuacct="${rc_cgroup_cpuacct:-$RC_CGROUP_CPUACCT}" - [ -n "$cpuacct" ] && cgroup_set_values cpuacct "$cpuacct" - - local cpuset="${rc_cgroup_cpuset:-$RC_CGROUP_cpuset}" - [ -n "$cpuset" ] && cgroup_set_values cpuset "$cpuset" - - local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" - [ -n "$devices" ] && cgroup_set_values devices "$devices" - - local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" - [ -n "$memory" ] && cgroup_set_values memory "$memory" - - local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" - [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" - + local ctrl blkio cpu cpuacct cpuset devices memory net_prio + for ctrl in blkio:BLKIO cpu:CPU cpuacct:CPUACCT cpuset:CPUSET \ + devices:DEVICES memory:MEMORY net_prio:NET_PRIO; do + eval ${ctrl%:*}=\"\${rc_cgroup_${ctrl%:*}:-\${RC_CGROUP_${ctrl#*:}}}\" + eval test -n \"\${${ctrl%:*}}\" && cgroup_set_values "${ctrl%:*}" "\${${ctrl%:*}}" + done return 0 } cgroup_cleanup() { - cgroup_running || return 0 - ebegin "starting cgroups cleanup" - for sig in TERM QUIT INT; do - cgroup_get_pids || { eend 0 "finished" ; return 0 ; } - for i in 0 1; do - kill -s $sig $pids - for j in 0 1 2; do - cgroup_get_pids || { eend 0 "finished" ; return 0 ; } - sleep 1 - done - done 2>/dev/null + cgroup_get_state || return 0 + local CGROUP_GET_PIDS='cgroup_get_pids || { eend 0; return 0; };' SIG + ebegin "Cleaning up CGroups" + for SIG in TERM QUIT INT; do + eval $CGROUP_GET_PIDS + kill -$SIG $PIDS done - cgroup_get_pids || { eend 0 "finished" ; return 0; } - kill -9 $pids - eend $(cgroup_running && echo 1 || echo 0) "fail to stop all processes" + eval $CGROUP_GET_PIDS + kill -TERM $PIDS + cgroup_get_state + eend "$?" "Failed to stop all processes" }