mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
The icgroupd contains a simple shell script daemon and an procd enabled init script for configuring cgroups according to uci configuration and launching the daemon. The daemon will periodically look for new processes in the root cgroup and move them to sub-groups according to configuration.
76 lines
1.6 KiB
Bash
Executable file
76 lines
1.6 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
CGBASEDIR=$1
|
|
CGCONFIG=$2
|
|
[ -n "$CGBASEDIR" -a -n "$CGCONFIG" ] || exit 1
|
|
|
|
[ -r /lib/functions.sh ] || exit 1
|
|
. /lib/functions.sh
|
|
|
|
CGPROCMAP=/tmp/cgprocmap
|
|
CGPERIOD=3s
|
|
|
|
DBGLOG=/tmp/cgroupd.log
|
|
DEBUG=0
|
|
|
|
|
|
add_to_procmap () {
|
|
local name_grp=$1
|
|
local name grp
|
|
|
|
name=$(echo $name_grp |awk -F= '{print $1}')
|
|
grp=$(echo $name_grp |awk -F= '{print $2}')
|
|
|
|
echo "($name) $grp" >> $CGPROCMAP
|
|
}
|
|
|
|
# Read configuration file and create process:group look-up table
|
|
# in /tmp file
|
|
read_config () {
|
|
local enab
|
|
|
|
config_load $CGCONFIG
|
|
|
|
config_get enab cgroups enabled "1"
|
|
[ $enab -eq 0 ] && exit 1
|
|
|
|
config_get CGDEFGROUP cgroups defgroup "_undef_"
|
|
[ "$CGDEFGROUP" == "_undef_" ] && exit 1
|
|
[ "$DEBUG" == "1" ] && echo "default $CGDEFGROUP" >> $DBGLOG
|
|
|
|
echo -n '' > $CGPROCMAP
|
|
config_list_foreach procmap procmap add_to_procmap
|
|
[ "$DEBUG" == "1" ] && cat $CGPROCMAP >> $DBGLOG
|
|
}
|
|
|
|
# Move all process except init from cgroup root to cgroups according
|
|
# to /tmp look-up table
|
|
move_wild_procs () {
|
|
local wild_procs=$(cat $CGBASEDIR/cgroup.procs)
|
|
local pid name grp
|
|
|
|
for pid in $wild_procs; do
|
|
|
|
[ $pid -eq 1 ] && continue
|
|
if [ -d /proc/$pid ]; then
|
|
|
|
name=$(awk '{print $2}' /proc/$pid/stat)
|
|
grp=$(awk "\$1==\"$name\" {print \$2}" $CGPROCMAP)
|
|
|
|
[ "$grp" == "." ] && continue
|
|
[ -n "$grp" ] || grp=$CGDEFGROUP
|
|
|
|
[ "$DEBUG" == "1" ] && \
|
|
echo "Moving proc $pid $name to $grp" >> $DBGLOG
|
|
echo $pid > $CGBASEDIR/$grp/cgroup.procs
|
|
fi
|
|
done
|
|
}
|
|
|
|
|
|
[ "$DEBUG" == "1" ] && echo "$0 started $(date)" >> $DBGLOG
|
|
read_config
|
|
while true; do
|
|
move_wild_procs
|
|
sleep $CGPERIOD
|
|
done
|