add cgroup cleanup support
This adds the ability to kill all processes within a service's cgroup when that service is stopped or restarted.
This commit is contained in:
committed by
William Hubbs
parent
e4668a5061
commit
c984506537
@@ -1,6 +1,7 @@
|
||||
#!@SHELL@
|
||||
# Copyright (c) 2012 Alexander Vershilov <qnikst@gentoo.org>
|
||||
# Released under the 2-clause BSD license.
|
||||
extra_stopped_commands="${extra_stopped_commands} cgroup_cleanup"
|
||||
|
||||
cgroup_find_path()
|
||||
{
|
||||
@@ -15,6 +16,21 @@ cgroup_find_path()
|
||||
echo $result
|
||||
}
|
||||
|
||||
cgroup_get_pids()
|
||||
{
|
||||
local p
|
||||
pids=
|
||||
while read p; do
|
||||
[ $p -eq $$ ] || $pids="${pids} ${p}"
|
||||
done < /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks
|
||||
[ -n "$pids" ]
|
||||
}
|
||||
|
||||
cgroup_running()
|
||||
{
|
||||
[ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ]
|
||||
}
|
||||
|
||||
cgroup_set_values()
|
||||
{
|
||||
[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0
|
||||
@@ -86,3 +102,22 @@ cgroup_set_limits()
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
cgroup_cleanup()
|
||||
{
|
||||
yesno "${rc_cgroup_cleanup:-no}" && 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
|
||||
done
|
||||
cgroup_get_pids || { eend 0 "finished" ; return 0; }
|
||||
kill -9 $pids
|
||||
eend $(cgroup_running && echo 1 || echo 0) "fail to stop all processes"
|
||||
}
|
||||
|
Reference in New Issue
Block a user