diff options
author | Balbir Singh <balbir@linux.vnet.ibm.com> | 2008-04-14 21:11:40 +0000 |
---|---|---|
committer | Balbir Singh <balbir@linux.vnet.ibm.com> | 2008-04-14 21:11:40 +0000 |
commit | 852880eff7be980c5bd4c86e8451a4e120a054a7 (patch) | |
tree | ddee19e40d9f3794f2a5b80c6d15bc7673d81ca1 /scripts/init.d/wlm | |
parent | bbb65f3bbe504ad029577618708068a6ef9a9e57 (diff) | |
download | libcg-852880eff7be980c5bd4c86e8451a4e120a054a7.tar.gz libcg-852880eff7be980c5bd4c86e8451a4e120a054a7.tar.xz libcg-852880eff7be980c5bd4c86e8451a4e120a054a7.zip |
Add init scripts and a README. NOTE: These init scripts will change
frequently and drastically.
Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/branches/balbir@14 4f4bb910-9a46-0410-90c8-c897d4f1cd53
Diffstat (limited to 'scripts/init.d/wlm')
-rwxr-xr-x | scripts/init.d/wlm | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/scripts/init.d/wlm b/scripts/init.d/wlm new file mode 100755 index 0000000..ed463f6 --- /dev/null +++ b/scripts/init.d/wlm @@ -0,0 +1,253 @@ +# +# Start/Stop the workload manager +# +# Copyright IBM Corporation. 2008 +# +# Authors: Balbir Singh <balbir@linux.vnet.ibm.com> +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2.1 of the GNU Lesser General Public License +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# +# TODO: Make this code more robust, add error checking and recovery +# for invalid configuration or interrupted execution +# +# Make the script LSB compliant +# + +CONF_FILE=/etc/wlm.conf +PROC_CGROUPS_FILE=/proc/cgroups +CGROUP_FS=cgroup +MOUNT_POINT=/dev/container +#MOUNT_OPTS=cpu +IGNORE_OPTS="ns cpuset" + +parse_controller_file() { + ctlr=$1 + file=$2 + tuid="root" + tgid="root" + cuid="root" + cgid="root" + + pushd $PWD 2>&1 > /dev/null + while read name opts + do + case $name in + 'mount') + ;; + *) + echo "Creating class $name" + class=$name + mkdir -p $MOUNTPOINT/$class + cd $MOUNTPOINT/$class + + if echo $opts | grep -q "=" + then + for single_opt in $opts + do + cf=`echo $single_opt | cut -d '=' -f1` + co=`echo $single_opt | cut -d '=' -f2` + case $cf in + "tuid") + tuid=$co + ;; + "cuid") + cuid=$co + ;; + "tgid") + tgid=$co + ;; + "cgid") + cgid=$co + ;; + *) + echo -n $co > $cf + ;; + esac + done + chown -R $cuid:$cgid $MOUNTPOINT/$class + chown -R $tuid:$tgid $MOUNTPOINT/$class/tasks + fi + esac + done < $file + popd 2>&1 > /dev/null +} + +parse_controller_opts() { + name=$1; + file=$2; + + if [ ! -r $PROC_CGROUPS_FILE ] + then + echo "$PROC_CGROUPS_FILE does not exist, please compile" + echo "cgroups into the kernel" + exit 1 + else + line=`grep -w $name $PROC_CGROUPS_FILE` + if [ $? -ne 0 ] + then + echo "$name controller not enabled" + exit 1 + fi + + active=`echo $line | awk '{print $2}'` + if [[ $active -eq 0 ]] + then + echo "$name controller not mounted" + else + parse_controller_file $name $file + fi + fi +} + +parse_conf_file() { + while read name conf + do + # skip all comments + if ! echo $name | grep -q ^# + then + case $name in + 'mount') + MOUNTPOINT=`echo $conf | cut -d ' ' -f1`; + MOUNTOPTS=`echo $conf | cut -d ' ' -f2`; + ;; + esac + fi + done < $CONF_FILE + + return 0; +} + +mount_fs() { + if [ ! -r $PROC_CGROUPS_FILE ] + then + echo "$PROC_CGROUPS_FILE does not exist, please compile" + echo "cgroups into the kernel" + exit 1 + else + while read name hierarchy num_cgroups + do + if ! echo $name | grep -q ^# + then + echo $IGNORE_OPTS | grep -wq $name + if [[ $? -ne 0 ]] + then + MOUNT_OPTS=$name","$MOUNT_OPTS + fi + fi + done < $PROC_CGROUPS_FILE + MOUNT_OPTS=${MOUNT_OPTS%%","} + #line=`grep -w $MOUNT_OPTS $PROC_CGROUPS_FILE` + #if [ $? -ne 0 ] + #then + # echo "$name controller not enabled" + # exit 1 + #fi + fi + mkdir -p $MOUNTPOINT + mount -t $CGROUP_FS $CGROUP_FS -o $MOUNT_OPTS $MOUNTPOINT + # + # Give root tasks read/write permission to all, since tasks + # tasks will be moved to root frequently + # + chmod ago+rwx $MOUNTPOINT/tasks + chmod ago+rwx $MOUNTPOINT + chmod +t $MOUNTPOINT + return $? +} + +umount_fs() { + umount $MOUNTPOINT + rmdir $MOUNTPOINT +} + +create_classes() { + while read name conf + do + # skip all comments + if ! echo $name | grep -q ^# + then + case $name in + 'mount') + ;; + *) + parse_controller_opts $name $conf + esac + fi + + done < $CONF_FILE +} + +start() { + echo "Starting wlm service: " + mount_fs + if [ $? -eq 0 ] + then + create_classes + fi + [ $? == 0 ] && touch /var/lock/subsys/wlm + return $? +} + +move_all_to_init_class() { + cd $MOUNTPOINT + cat /proc/mounts | grep -w $MOUNTPOINT + if [ $? -ne 0 ] + then + echo "resource control filesystem not mounted" + exit 1 + fi + + for i in `find . -type d` + do + case $i in + '.') + ;; + *) + class=${i#./*} + echo "Removing class $class" + sed -nu p < ./$i/tasks > tasks + rmdir $i + ;; + esac + done + cd - > /dev/null +} + + +stop() { + move_all_to_init_class + umount_fs +} + +trapped() { + # + # Do nothing + # + true +} + +# +# main script work done here +# +trap "trapped ABRT" ABRT +trap "trapped QUIT" QUIT +trap "trapped TERM" TERM +trap "trapped INT" INT + +parse_conf_file + +case $1 in + 'start') + start; + ;; + 'stop') + stop; + ;; +esac + |