diff --git a/systemvm/patches/debian/config/etc/init.d/cloud b/systemvm/patches/debian/config/etc/init.d/cloud index 1f4f9ef9621..f9a9915223e 100755 --- a/systemvm/patches/debian/config/etc/init.d/cloud +++ b/systemvm/patches/debian/config/etc/init.d/cloud @@ -81,17 +81,15 @@ _failure() { } RETVAL=$? CLOUDSTACK_HOME="/usr/local/cloud" +if [ -f $CLOUDSTACK_HOME/systemvm/utils.sh ]; +then + . $CLOUDSTACK_HOME/systemvm/utils.sh +else + _failure +fi # mkdir -p /var/log/vmops -get_pids() { - local i - for i in $(ps -ef| grep java | grep -v grep | awk '{print $2}'); - do - echo $(pwdx $i) | grep "$CLOUDSTACK_HOME" | awk -F: '{print $1}'; - done -} - start() { local pid=$(get_pids) if [ "$pid" != "" ]; then diff --git a/systemvm/scripts/run.sh b/systemvm/scripts/run.sh index 146d96f0287..b6a3a27b9dc 100755 --- a/systemvm/scripts/run.sh +++ b/systemvm/scripts/run.sh @@ -23,15 +23,31 @@ #_run.sh runs the agent client. # set -x - +readonly PROGNAME=$(basename "$0") +readonly LOCKDIR=/tmp +readonly LOCKFD=500 + +CLOUDSTACK_HOME="/usr/local/cloud" +. $CLOUDSTACK_HOME/systemvm/utils.sh + +LOCKFILE=$LOCKDIR/$PROGNAME.xlock +lock $LOCKFILE $LOCKFD +if [ $? -eq 1 ];then + exit 1 +fi + while true do - ./_run.sh "$@" & - wait - ex=$? - if [ $ex -eq 0 ] || [ $ex -eq 1 ] || [ $ex -eq 66 ] || [ $ex -gt 128 ]; then - # permanent errors - sleep 5 + pid=$(get_pids) + action=`cat /usr/local/cloud/systemvm/user_request` + if [ "$pid" == "" ] && [ "$action" == "start" ] ; then + ./_run.sh "$@" & + wait + ex=$? + if [ $ex -eq 0 ] || [ $ex -eq 1 ] || [ $ex -eq 66 ] || [ $ex -gt 128 ]; then + # permanent errors + sleep 5 + fi fi # user stop agent by service cloud stop diff --git a/systemvm/scripts/utils.sh b/systemvm/scripts/utils.sh new file mode 100644 index 00000000000..4d55fc76cf4 --- /dev/null +++ b/systemvm/scripts/utils.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +CLOUDSTACK_HOME="/usr/local/cloud" + +get_pids() { + local i + for i in $(ps -ef| grep java | grep -v grep | awk '{print $2}'); + do + echo $(pwdx $i) | grep "$CLOUDSTACK_HOME" | awk -F: '{print $1}'; + done +} + +lock() +{ + lockfile=$1 + lockfd=$2 + eval "exec $lockfd>$lockfile" + flock -n $lockfd\ + && return 0 \ + || return 1 +}