改進uwsgi啟動指令碼,使其支援多個獨立配置檔案

lykyl的自留地發表於2016-02-18

最近在研究flask,在架設執行環境的時候犯了難。因為我想把每個獨立的應用像NGINX處理多個網站那樣,每個應用單獨一個配置檔案。而網上流傳的uwsgi啟動指令碼都只支援單個配置檔案。雖然有文章說可以把多個應用的配置寫成命令整合到啟動指令碼里,但那樣的話顯然不夠靈活。官方文件看了頭實在是大,找來找去也沒個頭緒。於是決定自己把啟動指令碼改進一下。在原來指令碼的基礎上加入了配置檔案遍歷獲取,再迴圈處理每個配置檔案。改造難度不大效果卻很好,完美實現我的需求。現將程式碼貼出來分享給有需要的人。當然如果您有更簡便的方法能達到目的,還請勞煩告之一聲。

特別宣告:

1、 指令碼只支援INI格式配置檔案的載入,如需要載入其他格式配置檔案請自行修改指令碼中對應位置程式碼。

2、 PID檔名要求與配置檔名一致,副檔名為pid。如果不一樣會導致程式不能正常關閉或重新載入。

3、 指令碼命名為uwsgi_svr儲存到/etc/init.d/目錄下,記得配置執行許可權。

#!/bin/bash
# chkconfig: 2345 55 25
# Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f uwsgi defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add uwsgi'

### BEGIN INIT INFO
# Provides:          uwsgi
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the uwsgi web server
# Description:       starts uwsgi using start-stop-daemon
### END INIT INFO

# Modify by lykyl
# Ver:1.1
# Description: script can loads multiple configs now.
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi_srv
DAEMON=/usr/local/bin/uwsgi
CONFIGDIR=/etc/uwsgi/
PIDDIR=/var/run/
SCRIPTNAME=/etc/init.d/$NAME
FindCmd="/usr/bin/find"
declare -a iniList
declare -a SiteNameList

 
function Init() {
    iniList=`$FindCmd $CONFIGDIR -name '*.ini'`
    for i in ${iniList[@]}
    do
       SiteNameList=(${SiteNameList[@]} `basename $i|awk -F. '{print $1}'`)
    done
}

function Start() 
{
    local c=0
    for i in ${iniList[@]}
    do
      if $DAEMON $i; then
        echo "${SiteNameList[$c]} started"
      else
        echo "${SiteNameList[$c]} already running"
      fi
      let ++c
    done
}
 
function Stop() 
{
    local c=0
    for i in ${SiteNameList[@]}
    do
      if $DAEMON --stop ${PIDDIR}${i}.pid; then
        echo "${SiteNameList[$c]} stoped"
      else
        echo "${SiteNameList[$c]} not running"
      fi
      rm -f ${PIDDIR}${i}.pid
      let ++c
    done
}
 
function Reload() 
{
    local c=0
    for i in ${SiteNameList[@]}
    do
      if $DAEMON --reload ${PIDDIR}${i}.pid; then
        echo "${SiteNameList[$c]} reloaded"
      else
        echo "${SiteNameList[$c]} can't reload"
      fi
      let ++c
    done
}
 
function Status() 
{
    ps aux|grep $DAEMON
    echo
}

#main
set -e
[ -x "$DAEMON" ] || exit 0
Init
 
case "$1" in
 status)
    echo -en "Status $NAME: \n" 
   Status ;; start) echo -en "Starting $NAME: \n" Start ;; stop) echo -en "Stopping $NAME: \n" Stop ;; reload|graceful) echo -en "Reloading $NAME: \n" Reload ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2 exit 3 ;; esac exit 0

  

相關文章