随笔-88  评论-224  文章-23  trackbacks-0
脚本概述
   nginx是一款著名的开源web服务器,为方便升级与恢复,编写了一个简单的脚本,因为升级备份了可执行文件和配置文件(后缀名为old),所以可用于恢复。当升级时,若nginx正在运行,则不中断服务进行平滑升级,否则直接拷贝覆盖;当恢复时,若nginx正在运行,则不中断服务进行平滑恢复,否则直接拷贝覆盖。是否正在运行根据pid来判断,而pid从pid文件读取,pid文件则从conf文件提取(默认为/usr/local/nginx/logs/nginx.pid)。对于参数指定的conf文件,会分析它是否存在http {和server {行来检查有效性。该脚本的用法如下:
   ● 第1参数必须为upgrade或restore,分别表示升级或恢复。
   ● 第2参数是可选的,为nginx可执行文件,默认为/usr/local/nginx/sbin/nginx。
   ● 第3参数是可选的,为nginx配置文件,默认为/usr/local/nginx/conf/nginx.conf。

脚本实现
   在循环读取配置文件每一行时,首先要忽略空白行和注释行,对应正则式分别为^$、^[[:blank:]]*#;然后识别http {或server {行,对应正则式分别为^[[:blank:]]*http[[:blank:]]*{[[:blank:]]*、^[[:blank:]]*server[[:blank:]]*{[[:blank:]]*。不管恢复还是升级,当替换nginx可执行文件后,如果nginx正在运行(一定要使用mv替换才能成功),先发送USR2信号(通知nginx创建新的工作进程)并等待老的pid文件出现,再发送QUIT使老的nginx工作进程退出。
  1#! /bin/bash
  2# nginx admin script
  3
  4. extfuncs
  5
  6usage()
  7{
  8  echo "Usage: $(basename "$0") upgrade|restore [executable file] [configure file]"
  9  exit 1
 10}

 11
 12if [ $# -lt 1 ]; then
 13  usage
 14elif [ "$1" != "upgrade" -"$1" != "restore" ]; then
 15  echo "The first parameter must be upgrade or restore" 
 16  exit 1
 17fi
 18
 19do_restore=no
 20"$1" = "restore" ] && do_restore=yes
 21    
 22bin_file=${2:-/usr/local/nginx/sbin/nginx}
 23! check_file_exist "$bin_file" && usage
 24
 25if [ ! -"$bin_file" ]; then
 26  echo "$bin_file: Permission denied"
 27  exit 1
 28fi
 29
 30conf_file=${3:-/usr/local/nginx/conf/nginx.conf}
 31! check_file_exist "$conf_file" && usage
 32
 33re_0="[[:blank:]]"
 34re_1="$re_0*"
 35re_2="^$re_1"
 36re_3="$re_0+.+"
 37re_4="$re_2#"
 38re_http="${re_2}http${re_1}{${re_1}"
 39re_server="${re_2}server${re_1}{${re_1}"
 40re_pid="${re_2}pid$re_3"
 41
 42has_http=
 43has_server=
 44pid_file=
 45
 46while read line
 47do
 48  if (echo $line | grep "^$" > /dev/null|| (echo $line | grep "$re_4" > /dev/null); then
 49      continue
 50  elif (echo $line | grep "$re_http" > /dev/null); then
 51    has_http=yes
 52  elif (echo $line | grep "$re_server" > /dev/null); then
 53    has_server=yes
 54  test -"$pid_file" || pid_file=`echo $line | awk '{if($0~/'"$re_pid"'/) print substr($2,1,index($2,";")-1)}'`    
 55  test -"$pid_file" && break
 56done < "$conf_file"
 57
 58if [ "x$has_http" != "xyes" -"x$has_server" != "xyes" ]; then
 59  echo "$conf_file is not valid nginx configure file"
 60  exit 1
 61fi
 62
 63if [ -"$pid_file" ]; then
 64  pid_file=/usr/local/nginx/logs/nginx.pid
 65elif [ "${pid_file,0,1}" != "/" ]; then
 66  pid_file=/usr/local/nginx/$pid_file
 67fi
 68
 69"x$do_restore" = "xno" ] && ! check_file_exist nginx && exit 1
 70"x$do_restore" = "xyes" ] && ! check_file_exist "${bin_file}.old" && exit 1
 71"x$do_restore" = "xyes" ] && ! check_file_exist "${conf_file}.old" && exit 1
 72    
 73pid=$(get_pid "$pid_file")
 74check_pid $pid
 75ret=$?
 76
 77if [ "$ret" -eq "0" ]; then
 78  if [ "x$do_restore" = "xno" ]; then
 79     mv "$bin_file" "${bin_file}.old"
 80     cp "$conf_file" "${conf_file}.old"
 81  else
 82     mv "$bin_file" "${bin_file}.tmp"
 83  fi
 84  echo -"nginx is running($pid),"
 85else
 86  echo -"nginx is not run,"
 87fi
 88
 89if [ "x$do_restore" = "xno" ]; then
 90    echo "upgrading it"
 91else
 92    echo "restoring it"
 93fi
 94
 95if [ "x$do_restore" = "xno" ]; then    
 96  cp -f nginx $bin_file
 97else
 98  mv "${bin_file}.old" "$bin_file"    
 99  mv "${conf_file}.old" "$conf_file"
100fi
101
102$bin_file ---"$conf_file"
103
104if [ "$ret" -eq "0" ]; then
105  kill -USR2 $pid
106  wait_file "${pid_file}.oldbin" 
107  kill -QUIT `cat "${pid_file}.oldbin"`    
108  [ "x$do_restore" = "xyes" ] && rm -"${bin_file}.tmp"
109fi
110
111if [ "x$do_restore" = "xno" ]; then
112    echo "upgrade nginx finished"
113else
114  echo "restore nginx finished"
115fi

脚本示例
   升级前:nginx正在运行中,由于此时还没升级,所以没有old备份文件,如下图
   

   升级后:运行./ngxadmin upgrade后,如下图
   
   从上可得,sbin和conf子目录下分别多出了一个nginx.old和nginx.conf.old。

   恢复后:运行./ngxadmin restore后,如下图
   
   从上可得,sbin子目录下没有了nginx.old,conf子目录下没有了nginx.conf.old,nginx可执行文件和配置文件均已恢复为升级前的版本。
posted on 2015-01-19 00:36 春秋十二月 阅读(1387) 评论(0)  编辑 收藏 引用 所属分类: System

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理