aports/testing/libcgroup/cgconfig.initd
2015-09-15 09:40:39 +02:00

121 lines
2.7 KiB
Plaintext

#!/sbin/openrc-run
#
# Control Groups Configuration Startup
#
# This script runs the cgconfigparser utility to parse and setup
# the control group filesystem. It uses ${CONFIG_FILE}
# and parses the configuration specified in there.
#
CGCONFIGPARSER="/usr/sbin/cgconfigparser"
CGROUP_FS="cgroup"
CONFIG_FILE=${CONFIG_FILE:-"/etc/cgconfig.conf"}
MOUNTS_FILE="/proc/mounts"
RULES_FILE="/etc/cgrules.conf"
# Support multiple mount points
MOUNT_POINTS=
move_all_to_init_class() {
local i
for i in $MOUNT_POINTS; do
local mount_point=${i%:*}
cd ${mount_point}
if grep -qw "${mount_point}" ${MOUNTS_FILE}; then
local directory
for directory in $(find . -depth -type d); do
if [ "${directory}" != "." ]; then
# cat fails with "Argument list too long" error
sed -nu p < ${directory}/tasks > tasks
rmdir ${directory}
fi
done
else
ewarn "Resource control filesystem not mounted"
fi
cd - >/dev/null
done
}
parse_mounts() {
local device mount_point fs_type options other
while read device mount_point fs_type options other; do
if echo ${CGROUP_FS} | grep -q ${device}; then
MOUNT_POINTS="${MOUNT_POINTS} ${mount_point}:${options}"
fi
done < ${MOUNTS_FILE}
}
umount_fs() {
local i
for i in ${MOUNT_POINTS}; do
umount ${i%:*}
rmdir ${i%:*}
done
}
depend() {
need local
}
start() {
ebegin "Starting cgconfig service"
# Mount filesystem and create cgroups
if ! ${CGCONFIGPARSER} -l ${CONFIG_FILE} >/dev/null; then
eend 1 "Failed to parse ${CONFIG_FILE}"
return 1
fi
parse_mounts
# Find default cgroup name in rules file
local default_cgroup
if [ -f "${RULES_FILE}" ]; then
default_cgroup=$(awk '$1 == "*" {print $3; exit}' ${RULES_FILE})
if [ $default_cgroup == "*" ]; then
ewarn "${RULES_FILE} incorrect"
ewarn "Overriding it"
default_cgroup=
fi
fi
# Use predefined name if none was found
if [ -z "${default_cgroup}" ]; then
default_cgroup=sysdefault
fi
# Create a default cgroup for tasks to return back to
local i
for i in $MOUNT_POINTS; do
local mount_point=${i%:*}
local mount_options=${i#*:}
# Ignore if directory already exists
mkdir -p ${mount_point}/${default_cgroup}
find ${mount_point}/ -name tasks | xargs chmod a+rw
chmod go-w ${mount_point}/tasks
# Special rule for cpusets
if echo ${mount_options} | grep -qw cpuset; then
cat ${mount_point}/cpuset.cpus > ${mount_point}/${default_cgroup}/cpuset.cpus
cat ${mount_point}/cpuset.mems > ${mount_point}/${default_cgroup}/cpuset.mems
fi
# Classify everything to default cgroup
local j
for j in $(ps --no-headers -eL o tid); do
echo $j > ${mount_point}/${default_cgroup}/tasks 2>/dev/null
done
done
eend 0
}
stop() {
ebegin "Stopping cgconfig service"
parse_mounts
move_all_to_init_class
umount_fs
eend 0
}