Lines 5-52
Link Here
|
5 |
|
5 |
|
6 |
cgroup_find_path() |
6 |
cgroup_find_path() |
7 |
{ |
7 |
{ |
8 |
local OIFS n name dir result |
8 |
local ifs="$IFS" name dir DIR |
9 |
[ -n "$1" ] || return 0 |
9 |
[ -n "$1" ] || return 0 |
10 |
OIFS="$IFS" |
|
|
11 |
IFS=":" |
10 |
IFS=":" |
12 |
while read n name dir; do |
11 |
while read n name dir; do |
13 |
[ "$name" = "$1" ] && result="$dir" |
12 |
[ "$name" = "$1" ] && DIR="$dir" |
14 |
done < /proc/1/cgroup |
13 |
done < /proc/1/cgroup |
15 |
IFS="$OIFS" |
14 |
IFS="$ifs" |
16 |
echo $result |
15 |
echo "$DIR" |
17 |
} |
16 |
} |
18 |
|
17 |
|
19 |
cgroup_get_pids() |
18 |
cgroup_get_pids() |
20 |
{ |
19 |
{ |
21 |
local p |
20 |
local p |
22 |
pids= |
21 |
PIDS= |
23 |
while read p; do |
22 |
while read p; do |
24 |
[ $p -eq $$ ] || pids="${pids} ${p}" |
23 |
[ $p -eq $$ ] || PIDS="$PIDS $p" |
25 |
done < /sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks |
24 |
done < /sys/fs/cgroup/openrc/$RC_SVCNAME/tasks |
26 |
[ -n "$pids" ] |
25 |
[ -n "$PIDS" ] |
27 |
} |
26 |
} |
28 |
|
27 |
|
29 |
cgroup_running() |
28 |
cgroup_get_state() |
30 |
{ |
29 |
{ |
31 |
[ -d "/sys/fs/cgroup/openrc/${RC_SVCNAME}" ] |
30 |
[ -d "/sys/fs/cgroup/openrc/$RC_SVCNAME" ] |
32 |
} |
31 |
} |
33 |
|
32 |
|
34 |
cgroup_set_values() |
33 |
cgroup_set_values() |
35 |
{ |
34 |
{ |
36 |
[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0 |
35 |
[ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0 |
37 |
|
36 |
|
38 |
local controller="$1" h=$(cgroup_find_path "$1") |
37 |
local ctrl="$1" group head=$(cgroup_find_path "$1") |
39 |
cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}" |
38 |
group="/sys/fs/cgroup/${1}${head}openrc_${RC_SVCNAME}" |
40 |
[ -d "$cgroup" ] || mkdir -p "$cgroup" |
39 |
[ -d "$group" ] || mkdir -p "$group" |
41 |
|
40 |
|
42 |
set -- $2 |
41 |
set -- $2 |
43 |
local name val |
42 |
local name val |
44 |
while [ -n "$1" -a "$controller" != "cpuacct" ]; do |
43 |
while [ -n "$1" -a "$ctrl" != "cpuacct" ]; do |
45 |
case "$1" in |
44 |
case "$1" in |
46 |
$controller.*) |
45 |
$ctrl.*) |
47 |
if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then |
46 |
if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then |
48 |
veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" |
47 |
veinfo "$RC_SVCNAME: Setting $group/$name to $val" |
49 |
echo $val > "$cgroup/$name" |
48 |
echo "$val" > "$group/$name" |
50 |
fi |
49 |
fi |
51 |
name=$1 |
50 |
name=$1 |
52 |
val= |
51 |
val= |
Lines 57-134
Link Here
|
57 |
esac |
56 |
esac |
58 |
shift |
57 |
shift |
59 |
done |
58 |
done |
60 |
if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then |
59 |
if [ -n "$name" -a -f "$group/$name" -a -n "$val" ]; then |
61 |
veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" |
60 |
veinfo "$RC_SVCNAME: Setting $group/$name to $val" |
62 |
echo $val > "$cgroup/$name" |
61 |
echo "$val" > "$group/$name" |
63 |
fi |
62 |
fi |
64 |
|
63 |
if [ -f "$group/tasks" ]; then |
65 |
if [ -f "$cgroup/tasks" ]; then |
64 |
veinfo "$RC_SVCNAME: Adding to $group/tasks" |
66 |
veinfo "$RC_SVCNAME: adding to $cgroup/tasks" |
65 |
echo 0 > "$group/tasks" |
67 |
echo 0 > "$cgroup/tasks" |
|
|
68 |
fi |
66 |
fi |
69 |
|
|
|
70 |
return 0 |
67 |
return 0 |
71 |
} |
68 |
} |
72 |
|
69 |
|
73 |
cgroup_add_service() |
70 |
cgroup_add_service() |
74 |
{ |
71 |
{ |
75 |
# relocate starting process to the top of the cgroup |
72 |
# FIXME: |
76 |
# it prevents from unwanted inheriting of the user |
73 |
# Relocating process to the top of the CGroup to prevent |
77 |
# cgroups. But may lead to a problems where that inheriting |
74 |
# unwanted inheriting user CGroup may lead to issue when |
78 |
# is needed. |
75 |
# inheriting may be necessary. |
79 |
for d in /sys/fs/cgroup/* ; do |
76 |
if yesno ${rc_cgroup_inherit:-${RC_CGROUP_INHERIT:-Yes}}; then |
80 |
[ -f "${d}"/tasks ] && echo 0 > "${d}"/tasks |
77 |
local dir |
81 |
done |
78 |
for dir in /sys/fs/cgroup/*; do |
|
|
79 |
[ -f "$dir"/tasks ] && echo $$ > "$dir"/tasks |
80 |
done |
81 |
fi |
82 |
|
82 |
|
83 |
openrc_cgroup=/sys/fs/cgroup/openrc |
83 |
local group cgroup=/sys/fs/cgroup/openrc |
84 |
if [ -d "$openrc_cgroup" ]; then |
84 |
if [ -d "$cgroup" ]; then |
85 |
cgroup="$openrc_cgroup/$RC_SVCNAME" |
85 |
group="$cgroup/$RC_SVCNAME" |
86 |
mkdir -p "$cgroup" |
86 |
mkdir -p "$group" |
87 |
[ -f "$cgroup/tasks" ] && echo $$ > "$cgroup/tasks" |
87 |
[ -f "$group/tasks" ] && echo $$ > "$group/tasks" |
88 |
fi |
88 |
fi |
89 |
} |
89 |
} |
90 |
|
90 |
|
91 |
cgroup_set_limits() |
91 |
cgroup_set_limits() |
92 |
{ |
92 |
{ |
93 |
local blkio="${rc_cgroup_blkio:-$RC_CGROUP_BLKIO}" |
93 |
local ctrl blkio cpu cpuacct cpuset devices memory net_prio |
94 |
[ -n "$blkio" ] && cgroup_set_values blkio "$blkio" |
94 |
for ctrl in blkio:BLKIO cpu:CPU cpuacct:CPUACCT cpuset:CPUSET \ |
95 |
|
95 |
devices:DEVICES memory:MEMORY net_prio:NET_PRIO; do |
96 |
local cpu="${rc_cgroup_cpu:-$RC_CGROUP_CPU}" |
96 |
eval ${ctrl%:*}=\"\${rc_cgroup_${ctrl%:*}:-\${RC_CGROUP_${ctrl#*:}}}\" |
97 |
[ -n "$cpu" ] && cgroup_set_values cpu "$cpu" |
97 |
eval test -n \"\${${ctrl%:*}}\" && cgroup_set_values "${ctrl%:*}" "\${${ctrl%:*}}" |
98 |
|
98 |
done |
99 |
local cpuacct="${rc_cgroup_cpuacct:-$RC_CGROUP_CPUACCT}" |
|
|
100 |
[ -n "$cpuacct" ] && cgroup_set_values cpuacct "$cpuacct" |
101 |
|
102 |
local cpuset="${rc_cgroup_cpuset:-$RC_CGROUP_cpuset}" |
103 |
[ -n "$cpuset" ] && cgroup_set_values cpuset "$cpuset" |
104 |
|
105 |
local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" |
106 |
[ -n "$devices" ] && cgroup_set_values devices "$devices" |
107 |
|
108 |
local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" |
109 |
[ -n "$memory" ] && cgroup_set_values memory "$memory" |
110 |
|
111 |
local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" |
112 |
[ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" |
113 |
|
114 |
return 0 |
99 |
return 0 |
115 |
} |
100 |
} |
116 |
|
101 |
|
117 |
cgroup_cleanup() |
102 |
cgroup_cleanup() |
118 |
{ |
103 |
{ |
119 |
cgroup_running || return 0 |
104 |
cgroup_get_state || return 0 |
120 |
ebegin "starting cgroups cleanup" |
105 |
local CGROUP_GET_PIDS='cgroup_get_pids || { eend 0; return 0; };' SIG |
121 |
for sig in TERM QUIT INT; do |
106 |
ebegin "Cleaning up CGroups" |
122 |
cgroup_get_pids || { eend 0 "finished" ; return 0 ; } |
107 |
for SIG in TERM QUIT INT; do |
123 |
for i in 0 1; do |
108 |
eval $CGROUP_GET_PIDS |
124 |
kill -s $sig $pids |
109 |
kill -$SIG $PIDS |
125 |
for j in 0 1 2; do |
|
|
126 |
cgroup_get_pids || { eend 0 "finished" ; return 0 ; } |
127 |
sleep 1 |
128 |
done |
129 |
done 2>/dev/null |
130 |
done |
110 |
done |
131 |
cgroup_get_pids || { eend 0 "finished" ; return 0; } |
111 |
eval $CGROUP_GET_PIDS |
132 |
kill -9 $pids |
112 |
kill -TERM $PIDS |
133 |
eend $(cgroup_running && echo 1 || echo 0) "fail to stop all processes" |
113 |
cgroup_get_state |
|
|
114 |
eend "$?" "Failed to stop all processes" |
134 |
} |
115 |
} |