X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fscripts%2Fvserver.stop;h=7db361e751fa6fc3373d1fdce24ad2b76e105534;hb=dfa40e043f50b3ed0f89cdec01d0655c94c1e12e;hp=b117826b29f260096326d10d45acad521aebb858;hpb=9a4a9a1370d7a103cd55f00834e87d3b1a5abd14;p=util-vserver.git diff --git a/util-vserver/scripts/vserver.stop b/util-vserver/scripts/vserver.stop index b117826..7db361e 100644 --- a/util-vserver/scripts/vserver.stop +++ b/util-vserver/scripts/vserver.stop @@ -15,32 +15,65 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +lock "$__LOCKDIR"/vserver."$($_VSERVER_INFO "$VSERVER_DIR" CANONIFY)".startup + if ! isVserverRunning "$VSERVER_DIR" S_CONTEXT; then - echo $"vserver '$VSERVER_NAME' is not running; aborting..." >&2 - test "$OPTION_DEBUG" || exec 2>/dev/null >/dev/null + warning $"vserver '$VSERVER_NAME' is not running" >&2 + test -n "$OPTION_DEBUG" || exec 2>/dev/null >/dev/null umountVserver "$VSERVER_DIR" || : disableInterfaces "$VSERVER_DIR" || : - exit 1 + unlock + exit 0 fi +function cleanup +{ + set +e + unlock + + test ! -p "$sync_fifo" || { + $_RM -f "$sync_fifo" + $_RMDIR $($_DIRNAME "$sync_fifo") + } + + test ! -d "$vwait_statdir" || + $_RM -rf "$vwait_statdir" +} + +vwait_statdir= +vwait_pid= +sync_fifo= +trap "cleanup" EXIT + +OPTION_FORCE_SYNC=1 + set -e generateOptions "$VSERVER_DIR" set +e -cd "$VSERVER_DIR"/vdir/ -execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-stop +vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT" +initSync "$VSERVER_DIR" "$S_CONTEXT" sync_fifo +prepareStop "$VSERVER_DIR" cd "$VSERVER_DIR"/vdir/ +execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-stop +cd "$VSERVER_DIR"/vdir/ -if test "$_IS_FAKEINIT" && \ - $_VSERVER_INFO - FEATURE vkill && \ - initpid=$($_VSERVER_INFO "$S_CONTEXT" INITPID 2>/dev/null); then - $_VKILL -s INT -- "$initpid" && "${INITCMD_STOP_SYNC[@]}" || : +test -z "$OPTION_DEFAULTTTY" || setDefaultTTY "$VSERVER_DIR" + +fail= +initWait "$VSERVER_DIR" "$S_CONTEXT" vwait_statdir +if test -n "$_IS_FAKEINIT" && \ + $_VSERVER_INFO - FEATURE vkill; then + $_VKILL -s INT --xid "$S_CONTEXT" -- 1 || fail=1 + ## HACK: remove the 'initpid' stuff above when PID virtualization + ## is implemented elif $_VSERVER_INFO - FEATURE migrate; then "${NICE_CMD[@]}" \ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT" -- } \ $_VCONTEXT $SILENT_OPT --migrate --chroot --xid "$S_CONTEXT" -- \ - "${INITCMD_STOP[@]}" && "${INITCMD_STOP_SYNC[@]}" || : + "${INITCMD_STOP[@]}" || fail=1 else "${NICE_CMD[@]}" \ "$_CHBIND" "${CHBIND_OPTS[@]}" \ @@ -48,10 +81,13 @@ else ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \ $_CHCONTEXT_COMPAT "${CHCONTEXT_OPTS[@]}" \ "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" "." \ - "${INITCMD_STOP[@]}" && "${INITCMD_STOP_SYNC[@]}" || : + "${INITCMD_STOP[@]}" || fail=1 fi -sendKillSequence "$S_CONTEXT" "${INITKILL_SEQ[@]}" +waitForSync "$VSERVER_DIR" "$sync_fifo" "$vwait_statdir" + +vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT" +sendKillSequence "$S_CONTEXT" "${INITKILL_SEQ[@]}" ## Small hack... isVserverRunning removes stale runfiles as a sideeffect ! isVserverRunning "$VSERVER_DIR" || \