#!/bin/bash # # util-vserver sets the path to vshelper and kills all guest processes # # chkconfig: 2345 10 90 # description: Sets the path to vshelper and kills all guest processes # ### BEGIN INIT INFO # Provides: util-vserver # Required-Start: $remote_fs $syslog $time # Required-Stop: $remote_fs $syslog $time # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Sets the path to vshelper and kills all guest processes # Description: Sets the path to vshelper and kills all guest processes ### END INIT INFO : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} test -e "$UTIL_VSERVER_VARS" || { echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 exit 1 } . "$UTIL_VSERVER_VARS" LOCKFILE=util-vserver . "$_LIB_VSERVER_INIT_FUNCTIONS" . "$_LIB_FUNCTIONS" . "$__PKGLIBDIR/vserver.functions" function set_helper() { local f="/proc/sys/kernel/vshelper" if test -e "$f"; then echo "$_VSHELPER" > "$f" return 0 else return 2 fi } function kill_contexts() { local xid for xid in `ls -1 /proc/virtual 2>/dev/null`; do [ "$xid" = "info" -o "$xid" = "status" ] && continue $_VATTRIBUTE --xid $xid --set --flag ~persistent $_VKILL --xid $xid -s 15 sleep 3 $_VKILL --xid $xid -s 9 done local alive=0 for xid in `ls -1 /proc/virtual 2>/dev/null`; do [ "$xid" = "info" -o "$xid" = "status" ] && continue let alive+=1 done test $alive = 0 } function create_dirs() { $_MKDIR -p "$__RUNDIR" && $_MKDIR -p "$__VSHELPERSTATEDIR" && $_MKDIR -p `$_READLINK "$__PKGSTATEREVDIR"` } function mount_cgroup() { _generateCgroupOptions test -n "$CGROUP_MNT" || return 0 $_MKDIR -p "$CGROUP_MNT" if test -n "$CGROUP_MNT_PER_SS"; then for ss in "${CGROUP_SUBSYS[@]}"; do $_MKDIR -p "$CGROUP_MNT/$ss" $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT/$ss" done else oIFS="$IFS" IFS=, ss="${CGROUP_SUBSYS[*]}" IFS="$oIFS" $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT" fi } function umount_cgroup() { _generateCgroupOptions test -n "$CGROUP_MNT" || return 0 if test -n "$CGROUP_MNT_PER_SS"; then for ss in "${CGROUP_SUBSYS[@]}"; do $_UMOUNT "$CGROUP_MNT/$ss" done else $_UMOUNT "$CGROUP_MNT" fi } function start() { _beginResult $"Creating required directories" create_dirs _endResult $? _beginResult $"Setting path to vshelper" set_helper _endResult $? local retval=$? _beginResult $"Loading default device map" handleDeviceMap --set 0 "$__CONFDIR/.defaults/apps/vdevmap" _endResult $? if hasCgroup; then _beginResult $"Mounting cgroup-hierarchy" mount_cgroup _endResult $? fi test "$retval" -ne 0 || touch "$lockfile" return $retval } function stop() { # Stop all running, but non-default guests" _beginResult $"Stopping all running guests" $_START_VSERVERS -j 1 --all --stop _endResult $? _beginResult $"Killing all running contexts" kill_contexts _endResult $? local retval=$? if hasCgroup; then _beginResult $"Unmounting cgroup-hierarchy" umount_cgroup _endResult $? fi $_RM -f "$lockfile" return $retval } function restart() { stop start } case "$1" in start|stop|restart) $1;; reload) ;; condrestart) test -f $lockfile && restart || : ;; status) test -f $lockfile && { echo $"Path to vshelper has been set" exit 0 } echo $"Path to vshelper has not been set" exit 1 ;; *) echo "Usage: $0 {start|stop|reload|restart|condrestart|status}" exit 2 ;; esac