自定义公共bash脚本文件/usr/local/scripts/pub/functions
##Log the memseges to facility
Loging (){
if [ -z $LOGFILE ];then
[ ! -d /var/log/scripts ] && mkdir -p /var/log/scripts
LOGFILE=/var/log/scripts/`basename $0`.log
fi
if [ "$1"="-s" ];then
echo "`date +"%G-%m-%d %H:%M:%S"` $2" | tee -a $LOGFILE && return 0
fi
echo "`date +"%G-%m-%d %H:%M:%S"` $1" >> $LOGFILE
}

##Upload file to ftp servers
#You must Define variables needed,eg:
#                FTPSERVER=192.168.80.220
#                FTPLOGIN=backup
#                FTPASSWORD=hc360bak
#                FTP_SUBDIR=$1
#                CMD_LIST=( ls "lcd $1"    )

ftp_f (){
#SUBDIR=$FTP_SUBDIR
if [ -z $CMD_LIST    ];then
Loging -s    "WARNING:The CMD_LIST is null,and nothing can be excuted."
fi

[ -z $FTPSERVER ] && Loging -s "WARNING:The FTPSERVER is null,and the ftp server mybe not login."
[ -z $FTPLOGIN ] && Loging    -s    "WARNING:The FTPLOGIN is null,and the ftp server mybe not login."
[ -z $FTPPASSWORD ] && Loging -s "WARNING:The FTPPASSWORD is null,and the ftp server mybe not login."
echo "machine $FTPSERVER login $FTPLOGIN    password \"$FTPPASSWORD\"" >~/.netrc
chmod 600 ~/.netrc

#Create command list file
i=0
while [ $i -lt ${#CMD_LIST[*]} ]
do
echo "${CMD_LIST[${i}]}" >>~/.cmd_list
let i=$i+1
done

[ $? -eq 0 ] && Loging "INFO:Create comand file \"cmd_list\" is successful."

#ensure ftp can be closed
echo "bye" >>~/.cmd_list

ftp $FTPSERVER    <~/.cmd_list
if [ $? -eq 0 ];then
Loging "INFO:Exec command as \"cmd_list\"    is complete."
else
Loging "ERROR:Upload files to FTP is failure!" && return 1
fi

#clean temp file
#rm -rf ~/.netrc
rm -rf ~/.cmd_list
return 0

为了减少重复代码,编写之上两个通用函数,以备调用。下面是deploy.sh脚本。主要是针对tomcat的war包,进行自动备份、下载、更新、回滚等操作。具体看见脚本中help()的输出信息。
/usr/local/scripts/pub/deploy.sh
#!/bin/sh

if [ ! -f /usr/local/scripts/pub/functions ];then
echo "ERROR:/usr/local/scripts/pub/functions is not exist,and exit!" && exit 1
fi
. /usr/local/scripts/pub/functions

## initcial scipts variables
init_v(){

local PROJECT=

if [ -z $PROFILE ];then
PROFILE=/etc/profile.d/deploy.sh
fi

if [ -z $1 ];then
Loging "ERROR:Init error for project is not speciafied." && return 1
fi
#The $PROFILE is not exist and create it!
if [ ! -f $PROFILE ];then
echo "export D_${1}=`date +"%G%m%d"`:0" >>$PROFILE
fi
#Import the project var
. $PROFILE

#if project is not exist and create var
eval PROJECT=\$D_$1
if [ -z $PROJECT ];then
echo "export D_${1}=`date +"%G%m%d"`:0" >>$PROFILE
PROJECT="`date +"%G%m%d"`:0"
fi

#export the var
DATE=`echo $PROJECT|awk -F: '{print $1}'`
COUNT=`echo $PROJECT|awk -F: '{print $2}'`

if [ "$DATE" != `date +"%G%m%d"` ];then
Loging -s "INFO:The date is expire,and initate date and count."
DATE=`date +"%G%m%d"`
COUNT=0
fi

export DATE COUNT

}
## Write variable to profile config file
write_v(){

if [ -z $PROFILE ];then
PROFILE=/etc/profile.d/deploy.sh
fi
sed -i /D_${1}/s/=.*/=${DATE}:$COUNT/g    $PROFILE
}

##Define help function
help () {
echo -e "Usage:deploy.sh [command] [project name]\n"
echo -e "Usage:deploy.sh roll number [project name]"
echo -e "Command:"
echo -e "\tdeploy                     Deploy the project from ftp downloading *.war,and deploying. "
echo -e    "\tdeployb                     Backup the old project files or dirs,first,And than deploy the war from remote."
echo -e "\tbackup                     Backup the old project files or dirs."
echo -e "\troll:number                        Roll back the backup files    from backup ftp,the number default is last count of backup file"
echo -e "eg.:"
echo -e "\tdeploy.sh    deploy info"
}

##Download file from remote server.
download_f (){


if [ -z $1 ];then
Loging    "ERROR:Please speciafied argument for download_f func." && return 1
fi

local R_PATH=`dirname $1`
local R_FILENAME=`basename $1`
local L_PATH=/tmp

Loging -s "INFO:Begin download project file from remote server."
CMD_LIST=( "bin" "cd $R_PATH" "lcd $L_PATH" "get $R_FILENAME" "bye" )
ftp_f

if [ $? -ne 0 ];then
Loging -s "ERROR:Download $R_FILENAME is failure!" && return 1
fi
return 0
}


##Shutdown server
srv_shutd (){
#kill mutipl process of server
for i in `ps -ef|grep $1|grep -v grep|awk '{print \$2}'`
do
kill -9 $i
done
[ $? -eq 0 ] && Loging "INFO:Shutdown server is successfull!"
return 0
}


srv_start(){
if [ -z $TOMCAT_HOME ];then
TOMCAT_HOME=/usr/local/tomcat6
fi
#export java envirment variables
. /etc/profile.d/java.sh

##clear server cache files
rm -rf $TOMCAT_HOME/work/*

$TOMCAT_HOME/bin/startup.sh
}


##Backup the old directory
backup_f (){

#define the variables of function
local BACKUP_BASE_PATH=`dirname $1`
local BACKUP_DIR=`basename $1`
local BACKUP_FILE=${BACKUP_DIR}.bak${COUNT}.tar.gz
local EXCLUDE=
local BACKUP_COMMAND="tar -C $BACKUP_BASE_PATH -zcvf $BACKUP_FILE $BACKUP_DIR    $EXCLUDE"

if [ ! -d $1 -a ! -f $1 ];then
Loging    "ERROR:The $1 directory or file is not exsit! " && continue
fi

if [ -z "$BACKUP_COMMAND" ];then
Loging    "ERROR:Backup command is not defined!" && return 1
fi

#execute command
echo $BACKUP_COMMAND
$BACKUP_COMMAND    2>&1 >/dev/null

if [ $? -eq 0 ];then
Loging    -s "INFO: $BACKUP_FILE     is made successful!"
else
Loging    -s "ERROR: $BACKUP_FILE is made    failure!" && return 1
fi

#upload file to remote ftp server
CMD_LIST=( "mkdir $DATE" "cd $DATE" "mkdir backup" "cd backup" "put $BACKUP_FILE" "bye" )
ftp_f

if [ $? -eq 0 ];then
Loging    -s "INFO:Backup $BACKUP_FILE to remote is successful!"
rm -rf $BACKUP_FILE
else
Loging -s "ERROR:Backup $BACKUP_FILE is failure!" && return 1
fi

return 0

}


#Roll backup file    from ftp server,usage: roll_f <project> <backup count>
roll_f (){
local PORJECT=$1
local ROLL_COUNT=$2

if [ -z $ROLL_COUNT ];then
let ROLL_COUNT=$COUNT-1
fi


#Download backup files from remote ftp.
download_f $DATE/backup/${PORJECT}.bak$ROLL_COUNT.tar.gz

if [ ! -f /tmp/${PORJECT}.bak$ROLL_COUNT.tar.gz ];then
Loging "ERROR:Roll back failuer,mybe the /tmp/${PORJECT}.bak$ROLL_COUNT.tar.gz is not exist!"
return 1
fi

rm -rf /tmp/$PORJECT

tar -C /tmp -zxvf /tmp/${PORJECT}.bak$ROLL_COUNT.tar.gz    >>/dev/null

if [ ! -d /tmp/$PORJECT ];then
Loging    "ERROR:The /tmp/$PORJECT is not exsit.Exit!"
return 1
fi

#Shutdown    server of tomcat
srv_shutd tomcat
if [ $? -ne 0 ];then
Loging "ERROR:Shutdown server failure."    
return 1
fi

#Clear apps files

rm -rf $APPS_BASE/$PORJECT
rm -rf $APPS_BASE/${PORJECT}.war
mv /tmp/$PORJECT $APPS_BASE/

srv_start

if [ $? -eq 0 ];then
Loging "INFO:Move roll back files is successfull!"
else
Loging -s "ERROR:roll back failure!" && return 1
fi

}


##Deploy new files to server
deploy_f (){
local PROJECT=$1
#Download new files package from remote ftp.

#remove old app file and then download new file
#rm -rf /tmp/$PROJECT.war
download_f $DATE/$PROJECT.war
if [ ! -f /tmp/${PROJECT}.war ];then
Loging "ERROR:deploy failuer,mybe the /tmp/$PROJECT.war is not exist!"
return 1
fi

srv_shutd tomcat
if [ $? -ne 0 ];then
Loging    -s "ERROR:Shutdown server failure."
return 1
fi

#Clear the project in server
rm -rf $APPS_BASE/$PROJECT
rm -rf $APPS_BASE/$PROJECT.war

mv /tmp/$PROJECT.war $APPS_BASE/

#Start server
srv_start || return 1
Loging -s "INFO:Start server is ok!"
}


set_var () {
##Start scripts
#FTPSERVER=101.251.113.247
#FTPLOGIN=hdong
#FTPPASSWORD="ECHwey81"

##MMT ftp authentication

FTPSERVER=101.251.113.247
FTPLOGIN=zhounan
FTPPASSWORD="123ZXC,./"

CMD_LIST=( ls "lcd $1"    )
PROFILE=/etc/profile.d/deploy.sh

if [ -Z $TOMCAT_HOME    ];then
read -t20 -p "The variable $TOMCAT_HOME is null,Please specify the TOMCAT_HOME path:" TOMCAT_HOME
fi

TOMCAT_HOME=${TOMCAT_HOME:-"/usr/local/tomcat6"}

read -t10 -p "The apps default base path is \$TOMCAT_HOME/webapps,are you sure change it (Y/N):" FG

case $FG in

y|Y|yes|YES|Yes) read -t 30 -p "Please input:" APPS_BASE ;;

*) APPS_BASE=$TOMCAT_HOME/webapps
esac

}

###############################################Debug###############

#######################end#######################################


cd ~

#Initate variables

init_v $2

Loging -s "INFO:Initated variables complete.DATE=$DATE,COUNT=$COUNT."


case $1 in
     "deploy")shift
                        if [ -z    $1    ];then
                             help
                        fi
                        #Define variables
                        set_var
                        #Start deploy war-file
                        deploy_f $1
                        if [ $? -eq 0 ];then
                        Loging -s "INFO:Complete depoy successfull!"
                        fi
                        ;;
     "backup") shift
                         if [ -z    $1    ];then
                             help
                         fi
                        #Define variables
                        set_var
                        #Start backup old project
                         backup_f $TOMCAT_HOME/webapps/$1
                         if [ $? -eq 0 ];then
                            Loging -s "INFO:Complete backup old project successfull!"
                        #Write variables
                         let COUNT=$COUNT+1
                         write_v
                         fi
                         ;;
     "deployb")shift
                         if [ -z    $1    ];then
                             help
                         fi
                        
                         #Define variables
                         set_var
                         #Start backup old project
                            backup_f $TOMCAT_HOME/webapps/$1
                        
                         if [ $? -eq 0 ];then
                            Loging -s "INFO:Complete backup old project successfull!"
                         #Write variables
                         let COUNT=$COUNT+1
                         write_v
                         fi

                         #Start deploy war-file
                        deploy_f $1
                        if [ $? -eq 0 ];then
                        Loging -s "INFO:Complete depoy successfull!"
                        fi
                         ;;
         "roll") shift
                        
                         if [ -z    $1    ];then
                             help
                         fi
                        
                        #Define variables
                        set_var    
                        #Start Roll back from ftp server.
                         roll_f $1 $2

                         if [ $? -eq 0 ];then
                            Loging -s "INFO:Complete roll back    successfull!"
                         fi
                        ;;
                *) help&& exit 1
esac